首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法设置WH_KEYBOARD挂钩。WH_KEYBOARD_LL工程

无法设置WH_KEYBOARD挂钩。WH_KEYBOARD_LL工程
EN

Stack Overflow用户
提问于 2017-09-17 05:04:13
回答 1查看 1.1K关注 0票数 2

这是为我工作的WH_KEYBOARD_LL代码。

代码语言:javascript
复制
#include <Windows.h>
#include <iostream>

using namespace std;

HHOOK _hook;
KBDLLHOOKSTRUCT kbdStruct;
LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam) {
    cout << nCode;
    return CallNextHookEx(_hook, nCode, wParam, lParam);
}

void SetHook() {
    if (!(_hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0))) {
        cout << "SetWindowsHookEx Fail";
    }
}

void ReleaseHook() {
    UnhookWindowsHookEx(_hook);
}

int main() {
    SetHook();

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        // do something here
    }
    return 0;
}

但是,当我将SetWindowsHookEx行更改为if (!(_hook = SetWindowsHookEx(WH_KEYBOARD, HookCallback, NULL, GetCurrentThreadId())))时,它无法工作。

我有三个问题。

  1. 如何让WH_KEYBOARD钩子工作?
  2. 如果我将循环中的注释替换为cout,则不会看到任何控制台输出。所以我很困惑,循环的主体执行了吗?
  3. 我还读到,在GetMessage循环中,我应该添加一个对DispatchMessage的调用。DispatchMessageCallNextHookEx有什么区别?我读了关于他们两个人的文件,但都听不懂。
EN

回答 1

Stack Overflow用户

发布于 2017-09-17 06:02:24

根据回调函数文档:

SetWindowsHookEx函数一起使用的应用程序定义或库定义回调函数。每当应用程序调用GetMessage、message、PeekMessage函数时,系统都会调用该函数,并且有一条键盘消息(**WM_KEYUP** WM_KEYDOWN**)要处理**)。

您的WH_KEYBOARD回调不起作用,因为挂起的线程正在调用GetMessage(),但没有接收到任何WM_KEYUPWM_KEYDOWN消息。这些是窗口消息,但您没有可视窗口可供张贴。

WH_KEYBOARD_LL钩子运行在较低的级别,因此它不需要挂起的线程调用(Get|Peek)Message()来接收窗口消息。根据回调函数文档:

SetWindowsHookEx函数一起使用的应用程序定义或库定义回调函数。每当一个新的键盘输入事件即将被提交到线程输入队列中时,系统就调用这个函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46260845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档