我找到了这个键盘钩子代码,我试图为我的目的稍微修改:http: //blogs.msdn.com/toub/archive/2006/05/03/589423.aspx
作为一个概述,我想让用户按下一个键,比如“E”,并让键盘返回一个不同的字符“Z”,以显示任何应用程序的焦点。
我现在更改的相关方法如下所示:
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
//The truely typed character:
int vkCode = Marshal.ReadInt32(lParam);
Console.WriteLine((Keys)vkCode);
KBDLLHOOKSTRUCT replacementKey = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
replacementKey.vkCode = 90; // char 'Z'
Marshal.StructureToPtr(replacementKey, lParam, false);
//Now changed to my set character
vkCode = Marshal.ReadInt32(lParam);
Console.WriteLine((Keys)vkCode);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
控制台正确地将其输出为:
E
Z
T
Z
G
Z
etc.
但是,焦点应用程序仍然键入“E”而不是“Z”。为什么?我将挂钩的键盘输入更改为包含“Z”而不是“E”,并且控制台行显示它已正确更改!
据我了解,调用return CallNextHookEx(_hookID, nCode, wParam, lParam);
是将“立即打印”命令发送到打开的应用程序的原因。这不是它的工作原理吗?有什么东西阻止我输入我想要的字符吗?我知道像 AutoHotkey 这样的应用程序需要一个输入键,检查它,然后返回一个不同的字符。我如何在这里做同样的事情?
谢谢!