【问题标题】:C# .net send keys NOT using SendKey() but rather with hooking mabyeC# .net sendkeys 不使用 SendKey() 而是使用挂钩
【发布时间】:2016-10-15 15:41:21
【问题描述】:

在我的具体情况下,我正在尝试创建一个将键盘击键发送到 DosBox(dos-games 模拟器,而不是 windows 命令提示符)的应用程序。

我尝试使用 SendKeys 执行此操作,但这不起作用,因为 DosBox 不是处理 windows 消息的应用程序(一个例外告诉我)。

目前我正在尝试使用键盘挂钩来做到这一点,如下所示: 第一种方法是接收钩子击键并将它们传递到下一个应用程序(如this example

    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() 函数调用会引发访问冲突异常。

在这里我需要考虑什么?

【问题讨论】:

    标签: c# hook


    【解决方案1】:

    我认为你应该使用“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);
    }
    

    【讨论】:

      【解决方案2】:

      访问冲突是由LPARAMlow-level keyboard hook 造成的,即用

      创建的
      SetWindowsHookEx(WH_KEYBOARD_LL,...)
      

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

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

      就您要完成的工作而言,方法是使用SendInput 这是一个主题been covered here so so many times @ 987654330@itdoesnotbearrepeating.


      (这还不是所有的 SendInput 问题)

      【讨论】:

        猜你喜欢
        • 2011-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 2021-09-22
        • 2020-08-13
        • 2013-11-28
        相关资源
        最近更新 更多