簡體   English   中英

C#.net發送密鑰不使用SendKey()而是使用掛鈎mabye

[英]C# .net send keys NOT using SendKey() but rather with hooking mabye

在我的具體情況下,我正在嘗試創建一個將鍵盤按鍵發送到DosBox的應用程序(dos-games模擬器,而不是Windows命令提示符)。

我嘗試使用SendKeys這樣做,但這不起作用,因為DosBox不是一個處理Windows消息的應用程序(一個例外告訴我)。

目前我正在嘗試使用鍵盤鈎子,如下所示:第一種方法是接收鈎子擊鍵並將它們傳遞給下一個應用程序(如本示例中所示

    private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        return CallNextHookEx(hookId, nCode, wParam, lParam); 
    }

    private void GenerateKeyPress()
    {
        int vkCode = (int)Keys.Up;    //My chosen key to be send to dosbox
        IntPtr lParam = new IntPtr(vkCode); 
        IntPtr wParam = new IntPtr(255);

        CallNextHookEx(hookId, 0, wParam, lParam);
    }

但是,CallNextHookEx()函數調用會引發訪問沖突異常。

我在這里需要考慮什么?

訪問沖突的原因是LPARAM用於低級鍵盤鈎子 ,即用它創建的一個

SetWindowsHookEx(WH_KEYBOARD_LL,...)

是指向KBDLLHOOKSTRUCT的指針,而不是偽裝成指針的鍵碼。 你告訴掛鈎鏈中的下一個掛鈎來訪問任意內存位置。 (另外, WPARAM應該是WM_KEYDOWNWM_KEYUPWM_SYSKEYDOWNWM_SYSKEYUP 。)

您鏈接的示例代碼使用Marshal.ReadInt32(lParam)來獲取密鑰代碼,該代碼實際上是讀取指針引用的結構中的第一個整數。

至於你想實現什么,要做到這一點是使用SendInput這是這是一個話題 覆蓋 在這里 這么 時間 不能 承受 重復。


(這甚至不是所有的SendInput問題)

我認為您應該使用“keybd_event”來替換“SendKeys”。

public static class Keyboard
{
    public static void Press(Keys keys, int sleep = 1)
    {
        var keyValue = (byte)keys;

        NativeMethods.keybd_event(keyValue, 0, 0, UIntPtr.Zero); //key down

        Thread.Sleep(sleep);

        NativeMethods.keybd_event(keyValue, 0, 0x02, UIntPtr.Zero); //key up
    }
}

internal static partial class NativeMethods
{
    [DllImport("user32.dll")]
    internal static extern void keybd_event(byte bVk, byte bScan, int dwFlags, UIntPtr dwExtraInfo);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM