使用低级键盘钩来更改键盘字符
我正在创建自定义键盘布局。 作为开始步骤,我想让用户按一个键,让我的键盘钩子拦截它,并输出我选择的另一个键。
我找到了这个键盘钩子代码,我试图为我的目的略微修改: 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输出窗格还会A first chance exception of type 'System.ArgumentException' occurred in MirrorBoard.exe
错误中A first chance exception of type 'System.ArgumentException' occurred in MirrorBoard.exe
。
我可以在这里拦截键盘钩子并用我选择的角色替换它?
谢谢!
Marshal.PtrToStructure
的第二个参数必须是类而不是结构, KBDLLHOOKSTRUCT
可能是结构。
相反,你应该像这样使用它:
KBDLLHOOKSTRUCT replacementKey = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT)); replacementKey.vkCode = 90; // char 'Z' Marshal.StructureToPtr(replacementKey, lParam, false);