我发现这个键盘钩子代码,我试图稍微修改我的目的: 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”。 为什么? 我改变了被钩住的键盘input包含'Z'而不是'E',并且控制台线显示它被改正了!
据我所知,调用return CallNextHookEx(_hookID, nCode, wParam, lParam);
是什么发送“打印这个现在”命令到打开的应用程序。 这不是如何工作? 有什么东西阻止我input我想要的字符吗? 我知道像AutoHotkey这样的应用程序需要一个input键,检查它,并返回一个不同的字符。 我如何在这里做同样的事情?
谢谢!
我以前做过这个,但有点不一样。
而不是试图改变发送到CallNextHookEx
的参数,我'吞下'的按键(你可以通过返回一个非零值的钩子程序,以防止后续程序被调用)。
然后我使用SendInput发送我想要“注入”的新密钥。
所以基本上它是这样工作的:
注意循环重定向,即'a'重定向到'b'重定向到'a',它很容易炸毁;)
你很可能已经安装了“线程广泛”而不是“系统范围”的钩子,这意味着只有在安装钩子的线程才会进行密钥转换。
为了安装它“系统范围”,你将需要两件:一个DLL有“钩子提供者”和一个EXE管理它。 这里是一个很好的教程http://www.codeproject.com/KB/system/hooksys.aspx这里是一个例子: http : //www.codeguru.com/cpp/com-tech/shell/article.php/c4509 /
但是:1.安装系统挂钩可能会严重损坏您的系统(请确保您转发不翻译的按键)。 2.请…不要创建另一个键盘记录器