gpt4 book ai didi

c# - 我可以更改用户的键盘输入吗?

转载 作者:可可西里 更新时间:2023-11-01 14:37:21 25 4
gpt4 key购买 nike

我找到了这个键盘钩子(Hook)代码,我正试图为我的目的稍微修改它: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”。为什么?我将钩子(Hook)键盘输入更改为包含“Z”而不是“E”,控制台行显示它已正确更改!

据我所知,调用 return CallNextHookEx(_hookID, nCode, wParam, lParam); 是将“立即打印”命令发送到打开的应用程序的原因。这不是它的工作原理吗?有什么东西阻止我输入我想要的字符吗?我知道像 AutoHotkey 这样的应用程序接受一个输入键,检查它,然后返回一个不同的字符。我如何在这里做同样的事情?

谢谢!

最佳答案

我以前做过,但有点不同。
我没有尝试更改发送到 CallNextHookEx 的参数,而是“吞下”按键(您可以通过从 Hook 过程返回一个非零值来防止调用后续过程来做到这一点)。

然后我用了SendInput发送我想“注入(inject)”的新 key 。

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

  • 钩子(Hook)程序识别目标键被按下
  • 使用新 key 调用 SendInput
  • 从钩子(Hook)过程中返回 1 以忽略原始 key

小心循环重定向,即'a'重定向到'b'重定向到'a',它很容易爆炸;)

关于c# - 我可以更改用户的键盘输入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2069469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com