首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >误差SetWindowsHookEx和GetRawInputData

误差SetWindowsHookEx和GetRawInputData
EN

Stack Overflow用户
提问于 2020-02-07 02:17:02
回答 1查看 321关注 0票数 1

我有两个问题。

首先,我编写了一个小程序来捕捉所有鼠标事件。我在一个单独的线程中启动它,并得到一个无法调试的错误:

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


HHOOK hookHandle;

LRESULT CALLBACK callBackHook(int nCode, WPARAM wParam, LPARAM lParam) {

    if(nCode == HC_ACTION) {
        std::cout << "Something!" << std::endl;
    }

    return CallNextHookEx(hookHandle, nCode,
                          wParam, lParam);
}

int mouseHook() {


    hookHandle = SetWindowsHookEx(WH_MOUSE_LL , callBackHook, NULL, 0);

    if(hookHandle == NULL) {
        std::cout << "ERROR CREATING HOOK: ";
        std::cout << GetLastError() << std::endl;
        return 0;
    }

    MSG msg;

    while(GetMessage(&msg, NULL, 0, 0) != 0) {
        std::cerr << "message!" << std::endl;
    }

    UnhookWindowsHookEx(hookHandle);

    return 0;
}

int main(int argc, char *argv[])
{
    std::thread mouse(mouseHook);
    return 0;
}

错误信息(德语按钮上写着“取消”、“重试”、“忽略”):

第二,是否有可能从lParam获得callBackHook函数的原始数据输入?我不知道如何在没有HWND的情况下注册输入设备。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-07 08:32:00

首先,您需要等待线程退出,使用mouse.join()。如果主进程直接返回,它所拥有的线程也将终止,这将导致此问题。

代码语言:javascript
复制
int main(int argc, char* argv[])
{
    std::thread mouse(mouseHook);
    mouse.join();
    return 0;
}

第二,

我不知道如何在没有HWND的情况下注册输入设备

别担心,您可以为此创建一个仅消息窗口

示例(删除一些错误检查):

代码语言:javascript
复制
#include <windows.h>
#include <iostream>
using namespace std;
LRESULT CALLBACK WindProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    if (Msg == WM_INPUT)
    {
        cout << "Something!" << endl;
        HRAWINPUT hRawInput = (HRAWINPUT)lParam;
    }
    return DefWindowProc(hWnd, Msg, wParam, lParam);
}

int main()
{
    WNDCLASSEX wcx = { 0 };
    wcx.cbSize = sizeof(WNDCLASSEX);
    wcx.lpfnWndProc = WindProc;
    wcx.hInstance = GetModuleHandle(NULL);
    wcx.lpszClassName = TEXT("RawInputClass");
    RegisterClassEx(&wcx);
    HWND hWnd = CreateWindowEx(0, TEXT("RawInputClass"), NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, GetModuleHandle(NULL), NULL);

    RAWINPUTDEVICE rid = { 0 };
    rid.usUsagePage = 0x01;
    rid.usUsage = 0x02; //mouse
    rid.dwFlags = RIDEV_INPUTSINK;
    rid.hwndTarget = hWnd;

    RegisterRawInputDevices(&rid, 1, sizeof(RAWINPUTDEVICE));

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

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

https://stackoverflow.com/questions/60106245

复制
相关文章

相似问题

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