gpt4 book ai didi

c++ - 进行 SendInput 时调用全局低级键盘 Hook 。如何预防?

转载 作者:太空狗 更新时间:2023-10-29 21:30:44 28 4
gpt4 key购买 nike

我有一个用 c++ 编写的 win 32 应用程序,它设置了低级键盘 Hook 。现在我想将输入发送到任何应用程序,如 word/记事本。我该怎么做?

我已经足够使用 findwindow/sendmessage。对于所有这些,我需要知道编辑控件。找到编辑控件非常困难。

因为 SendInput 适用于任何 Windows 应用程序,所以我想使用它。问题是我用按下的键调用了我的回调函数。

例如,我按下了 A,我想将 U+0BAF unicode 字符发送到事件的应用程序窗口。在这种情况下,假设它是记事本。

问题是我在记事本中得到两个字符 U+0BAF 和 A。

正在发送 A 因为我正在调用 CallNextHookEx( NULL, nCode, wParam, lParam);

如果我在 sendInput 后​​返回 1,则不会向记事本发送任何内容。

有什么建议吗?

最佳答案

如果我对你的问题的理解正确,你应该在你的 Hook 过程中忽略“注入(inject)的”键事件,如下所示:

LRESULT CALLBACK
hook_proc( int code, WPARAM wParam, LPARAM lParam )
{
KBDLLHOOKSTRUCT* kbd = (KBDLLHOOKSTRUCT*)lParam;

// Ignore injected events
if (code < 0 || (kbd->flags & LLKHF_INJECTED)) {
return CallNextHookEx(kbdhook, code, wParam, lParam);
}
...

更新:此外,您必须吃掉字符并通过 Windows 消息通知其他一些字符按下例程。

例子:

...
// Pseudocode
if (kbd->vkCode is character) {
if (WM_KEYDOWN == wParam) {
PostMessage(mainwnd, WM_MY_KEYDOWN, kbd->vkCode, 0);
return 1; // eat the char, ie 'a'
}
}
return CallNextHookEx(kbdhook, code, wParam, lParam);

并且,在其他一些模块中,您处理 WM_MY_KEYDOWN:

ie, #define WM_MY_KEYDOWN (WM_USER + 1)

并调用将生成新按键事件的适当例程。

关于c++ - 进行 SendInput 时调用全局低级键盘 Hook 。如何预防?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1988459/

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