我正在创建一个自定义键盘布局。作为开始步骤,我希望用户按下一个键,我的键盘钩子拦截它,并输出我选择的不同键。
我发现了这个键盘钩子代码,我正在尝试略微修改以适应我的目的:http://blogs.msdn.com/toub/archive/2006/05/03/589423.aspx 我已将相关方法更改为:
我希望它声明一个新的KBD结构对象,将键盘钩子提供的KBD结构复制到其中,将我的对象的vkCode修改为使用不同的字符,然后用我修改后的版本覆盖提供的对象。这样应该能保持一切不变,除了它写入不同的字符。
不幸的是,它没有起作用。原始键盘字符被输入。Visual Studio输出窗格也会出现“MirrorBoard.exe中发生了System.ArgumentException类型的第一次机会异常”错误。
在这里我该怎么办才能拦截键盘钩子并用我选择的字符替换它呢?
谢谢!
我发现了这个键盘钩子代码,我正在尝试略微修改以适应我的目的:http://blogs.msdn.com/toub/archive/2006/05/03/589423.aspx 我已将相关方法更改为:
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
KBDLLHOOKSTRUCT replacementKey = new KBDLLHOOKSTRUCT();
Marshal.PtrToStructure(lParam, replacementKey);
replacementKey.vkCode = 90; // char 'Z'
Marshal.StructureToPtr(replacementKey, lParam, true);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
我希望它声明一个新的KBD结构对象,将键盘钩子提供的KBD结构复制到其中,将我的对象的vkCode修改为使用不同的字符,然后用我修改后的版本覆盖提供的对象。这样应该能保持一切不变,除了它写入不同的字符。
不幸的是,它没有起作用。原始键盘字符被输入。Visual Studio输出窗格也会出现“MirrorBoard.exe中发生了System.ArgumentException类型的第一次机会异常”错误。
在这里我该怎么办才能拦截键盘钩子并用我选择的字符替换它呢?
谢谢!
PtrToStructure
无法保存指向结构体的指针,因为它被装箱了(即它是一个副本)。我在我的答案中添加了正确的解决方案。 - Pent Ploompuu