我发现这个键盘挂钩的代码,我试图稍微修改我的目的: 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采取的输入关键,检查,然后返回一个不同的角色。我该怎么做同样的在这里吗?

谢谢!

有帮助吗?

解决方案

我已经这样做过但是有一点不同。
而不是试图改变的参数发送到 CallNextHookEx, 我吞'关键的新闻(你可以这样做,通过返回一个非零值挂钩的程序来防止的后续程序被称为).

然后我用 SendInput 发送的新的关键,我想'注入'.

所以基本上它的工作原理是这样的:

  • 钩的过程识别目标的关键是压
  • 呼叫SendInput,与新的关键
  • 回1从挂钩的过程忽略的原始钥匙

要小心的循环重定向,即'a'重要'b'重要'a',它可以很容易地击;)

其他提示

您有,最有可能的,安装钩子“线程宽”,而不是“全系统”,这意味着只发生在螺纹安装钩子密钥转变。

为了进行安装“的系统范围的”你将需要两个部分:具有“钩提供商”和一个exe管理它一个DLL。 这里是一个很好的教程 http://www.codeproject.com/KB/system/hooksys.aspx 这里一个例子: http://www.codeguru.com/cpp/com -tech /壳/ article.php / c4509 /

但: 1.安装系统范围的钩子能够认真搞砸了你的系统(请确保您转发您不要翻译键)。 2.请...不要创建另一个键盘记录

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top