在我的特定情况下,我正在尝试创建一个将键盘击键发送到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()函数调用会引发访问冲突异常。
我需要在这里想到什么?
访问冲突是由于以下事实引起的:LPARAM对于低级键盘挂钩,即使用
SetWindowsHookEx(WH_KEYBOARD_LL,...)
Run Code Online (Sandbox Code Playgroud)
是一个指向 a 的指针KBDLLHOOKSTRUCT,而不是伪装成指针的键码。您告诉钩子链中的下一个钩子访问任意内存位置。(此外,WPARAM应该是WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN或 之一WM_SYSKEYUP。)
您链接的示例代码用于Marshal.ReadInt32(lParam)获取关键代码,该代码实际上是读取指针引用的结构中的第一个整数。
就您想要实现的目标而言,实现这一目标的方法是使用该主题,SendInput该主题已在此处 讨论过 多次,无需重复。
(这甚至不是所有 SendInput 问题)
| 归档时间: |
|
| 查看次数: |
764 次 |
| 最近记录: |