gpt4 book ai didi

c++ - 低级键盘钩子(Hook) : callback not reached

转载 作者:行者123 更新时间:2023-11-30 03:06:21 28 4
gpt4 key购买 nike

我正在尝试创建一段快速代码来捕获平板电脑上“热键”按钮之一发送的键序列,并重新编程其功能。按钮在按下时发送 LWin+LCtrl+Tab。

搜索了一段时间后,我决定尝试使用 WH_KEYBOARD_LL Hook ,但几个小时后我仍然无法让 Hook 工作,更不用说实际功能了。

目前,我有以下内容:

// TestHook2.cpp

#include "stdafx.h"

HHOOK hook;
BOOL gotKey;
LRESULT WINAPI KeyTrap(int, WPARAM, LPARAM);
BOOL CtrlHandler(DWORD);

int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE);
HMODULE currentProcess = GetModuleHandle(NULL);
hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyTrap, currentProcess, 0);

if (!hook) {
printf("No hook, quitting!\n");
return 1;
}

while(1) {
if(gotKey) printf("Got Key!\n");
gotKey = FALSE;
}

return 0;
}

LRESULT CALLBACK KeyTrap(int nCode, WPARAM wParam, LPARAM lParam)
{
gotKey = TRUE;
return CallNextHookEx(hook, nCode, wParam, lParam);
}

BOOL CtrlHandler(DWORD fdwCtrlType)
{
if (fdwCtrlType == CTRL_C_EVENT)
{
printf("Got CTRL+C, unhooking...\n");
UnhookWindowsHookEx(hook);
}

return FALSE;
}

SetWindowsHookEx 返回的句柄绝对不是 NULL,但出于某种原因根本不会调用 KeyTrap,无论我尝试按下多少键。我还尝试将回调放在 DLL 中并在运行时使用 LoadLibrary,但这也给出了完全相同的结果。

我是所有这些 Win32 编程的新手,所以这很可能是一个非常愚蠢的错误。

非常感谢!

(PS:代码在 Win7 上运行。目前无法访问实际键盘,但已尝试从屏幕键盘、远程 (RDP) 输入和平板电脑上的硬件热键生成击键。这可能是问题?)

最佳答案

问题是您的控制台应用程序没有消息循环来处理 Hook 消息。

将您的 while(1) 循环替换为以下代码,看看是否可行:

   MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) != 0 )
{
TranslateMessage( &msg );
DispatchMessage( &msg );

if(gotKey)
printf("Got Key!\n");

gotKey = FALSE;
}

关于c++ - 低级键盘钩子(Hook) : callback not reached,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6740723/

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