【发布时间】:2011-01-04 23:40:23
【问题描述】:
我正在创建自定义键盘布局。作为开始步骤,我想让用户按下一个键,让我的键盘钩子拦截它,并输出我选择的不同键。
我找到了这个键盘钩子代码,我正在尝试对其进行稍微修改以用于我的目的: 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 错误。
我可以在这里做什么来拦截键盘钩子并将其替换为我选择的字符?
谢谢!
【问题讨论】:
标签: c# keyboard low-level keyboard-hook