使用低级别的键盘钩子改变键盘字符
-
20-09-2019 - |
题
我创建一个自定义的键盘布局。为起点一步,我希望让用户按下一个键,有我的键盘钩子截获它,并输出我选择的不同的密钥。
我发现这个键盘钩子代码,我想稍微修改一下我的目的: 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);
}
我希望它宣布一个新的病区结构对象,复制由键盘钩子供应到它的大骨节病结构,修改我的对象的vkCode使用不同的字符,然后用我的修改后的版本覆盖提供的对象。这样应该可以把一切都相同,除了它写一个不同的角色这一事实。
不幸的是,它不工作。原来的键盘字符键入。在Visual Studio输出窗格也得到了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);
不隶属于 StackOverflow