gpt4 book ai didi

c++ - 带 WH_KEYBOARD_LL 和 keybd_event 的全局键盘钩子(Hook) (windows)

转载 作者:可可西里 更新时间:2023-11-01 18:20:10 24 4
gpt4 key购买 nike

我正在尝试编写一个简单的全局键盘钩子(Hook)程序来重定向一些键。例如,当程序执行时,我在键盘上按下'a',程序可以禁用它并模拟'b'点击。我不需要图形用户界面,只需一个控制台就足够了(保持运行)

我的计划是用global hook来捕捉按键输入,然后用keybd_event模拟键盘。但是我有一些问题。

第一个问题是程序可以正确地阻止'A',但是如果我在键盘上按一次'A',回调函数中的printf 和keybd_event 都会执行两次。所以如果我打开一个 txt 文件,我点击一次“A”,有两个“B”输入。这是为什么?

第二个问题,为什么使用WH_KEYBOARD_LL的钩子(Hook)可以在没有dll的其他进程上工作?在我写这个例子之前,我认为我们必须使用一个 dll 来制作一个全局钩子(Hook)......

#include "stdafx.h"
#include <Windows.h>
#define _WIN32_WINNT 0x050

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL fEatKeystroke = FALSE;

if (nCode == HC_ACTION)
{
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
if (fEatKeystroke = (p->vkCode == 0x41)) { //redirect a to b
printf("Hello a\n");
keybd_event('B', 0, 0, 0);
keybd_event('B', 0, KEYEVENTF_KEYUP, 0);
break;
}
break;
}
}
return(fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}

int main()
{
// Install the low-level keyboard & mouse hooks
HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);

// Keep this app running until we're told to stop
MSG msg;
while (!GetMessage(&msg, NULL, NULL, NULL)) { //this while loop keeps the hook
TranslateMessage(&msg);
DispatchMessage(&msg);
}

UnhookWindowsHookEx(hhkLowLevelKybd);

return(0);
}

非常感谢!

最佳答案

由于 WM_KEYDOWNWM_KEYUP,您的回调函数执行了两次。当您按下键盘上的某个键时,Windows 将调用回调函数并发送 WM_KEYDOWN 消息,而当您释放该键时,Windows 将调用回调函数并发送 WM_KEYUP 消息。这就是你的回调函数执行两次的原因。

您应该将 switch 语句更改为:

switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
if (fEatKeystroke = (p->vkCode == 0x41)) //redirect a to b
{
printf("Hello a\n");

if ( (wParam == WM_KEYDOWN) || (wParam == WM_SYSKEYDOWN) ) // Keydown
{
keybd_event('B', 0, 0, 0);
}
else if ( (wParam == WM_KEYUP) || (wParam == WM_SYSKEYUP) ) // Keyup
{
keybd_event('B', 0, KEYEVENTF_KEYUP, 0);
}
break;
}
break;
}

关于你的第二个问题,我想你已经从@Ivan Danilov 那里得到了答案。

关于c++ - 带 WH_KEYBOARD_LL 和 keybd_event 的全局键盘钩子(Hook) (windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22975916/

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