C#.net发送密钥不使用SendKey(),而是使用钩住mabye

Rav*_*tal 5 c# hook

在我的特定情况下,我正在尝试创建一个将键盘击键发送到DosBox的应用程序(dos游戏模拟器,而不是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);
    }
Run Code Online (Sandbox Code Playgroud)

但是,CallNextHookEx()函数调用会引发访问冲突异常。

我需要在这里想到什么?

the*_*heB 4

访问冲突是由于以下事实引起的:LPARAM对于低级键盘挂钩,即使用

SetWindowsHookEx(WH_KEYBOARD_LL,...)
Run Code Online (Sandbox Code Playgroud)

是一个指向 a 的指针KBDLLHOOKSTRUCT,而不是伪装成指针的键码。您告诉钩子链中的下一个钩子访问任意内存位置。(此外,WPARAM应该是WM_KEYDOWNWM_KEYUPWM_SYSKEYDOWN或 之一WM_SYSKEYUP。)

您链接的示例代码用于Marshal.ReadInt32(lParam)获取关键代码,该代码实际上是读取指针引用的结构中的第一个整数。

就您想要实现的目标而言,实现这一目标的方法是使用主题SendInput该主题已此处 讨论 多次无需重复


(这甚至不是所有 SendInput 问题)