使用全局钩子更改键盘事件不起作用

时间:2015-10-03 17:15:12

标签: c# winapi hook native keyevent

我正在尝试创建一个安装全局钩子并捕获键盘输入的小程序。 现在,我试图将每个输入更改为“X”。 因此,如果我在任何地方写“你好”,它实际上会写“XXXXX”。 我成功地挂钩甚至停止传递我的钩子的任何输入,但我无法弄清楚如何改变输入。

相关方法:

IntPtr HookCallBack(int nCode, IntPtr wParam, IntPtr lParam)
{
        // Trying to change the input.
        Marshal.WriteInt32(lParam, 88);

        // Locked down
        if (isKeyboardLockedDown)
            return new IntPtr(1); // A non-zero return value blocks additional processing of key strokes.
        // Not locked down.
        else
            return NativeMethods.CallNextHookEx(hookId, nCode, wParam, lParam);
 }

如上所述 - 如果我理解正确 - lParam是存储输入密钥的地址。 因此我用“X”覆盖它。 该方法由于某种原因不起作用。 有什么建议吗?

2 个答案:

答案 0 :(得分:0)

如果输入为X:

调用CallNextHookEx()

否则

不要调用CallNextHookEx()。而是调用SendInput发布X。

SendInput

  

合成击键,鼠标移动和按钮点击。

注意:一般来说,不调用CallNextHookEx()是不明智的。然后,用X替换所有输入通常是不明智的: - )

答案 1 :(得分:0)

我在C中完成了一个类似的项目。而不是改变我生成输入的数据。它运行顺畅,不会减慢打字过程。 我使用了全球旗帜。对于输入i为真生成,对于来自用户的输入为假。 这几乎就是它的样子:

HookProc(int nCode, WPARAM wParam, LPARAM lParam) 
{  
    if(flag){ 
        flag = FALSE; 
        return CallNextHookEx(NULL, nCode, wParam, lParam);}  
    else{ 
        flag = TRUE; 
        keybd_event(what ever you want); 
        return 0;} 
}