钩子

时间:2016-10-22 07:48:28

标签: c++ windows hook hid interception

我有一个像键盘一样的HID usb rfid阅读器 我不想在我的表格(WPF)上放一个文本框来接收文本,因为我还有其他要求。 相反,我试图捕获按键事件并处理它们。因为我尝试了三种不同的方法:

Windows Hook(c ++) 这是说明问题的最简单的测试用例

#include <iostream>
#include <fstream>
#include <Windows.h>
#pragma comment(lib, "user32.lib")

HHOOK keyboardHook{ NULL };
DWORD lastkey = 0;

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

    KBDLLHOOKSTRUCT *kb = (KBDLLHOOKSTRUCT *)lParam;

    switch (wParam)
    {

    case WM_KEYUP:
        if (lastkey == 13)
           system("cls");
        std::cout << "KeyUp event : " << kb->vkCode   << std::endl;
        lastkey = kb->vkCode;
        break;
    }

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


int main(int argc, char* argv[])
{
    keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, MyLowLevelKeyBoardProc, NULL, 0);


    if (keyboardHook == NULL) {
        std::cout << "Keyboard hook failed!" << std::endl;
    }


    while (GetMessage(NULL, NULL, 0, 0));
    return 0;
}

原始输入API

通过处理WM_INPUT消息(显示的代码太多)

oblita拦截库

如果我解决问题,我将使用的最有趣的解决方案

#include "stdafx.h"
#include "C:\Dev\WPF\Interception\library\interception.h"

#include "C:\Dev\WPF\Interception\Interception-1.0.0\samples\utils.h"
#include <string>
#include <iostream>

enum ScanCode
{
    SCANCODE_X = 0x2D,
    SCANCODE_Y = 0x15,
    SCANCODE_ESC = 0x01
};

int main()
{

    using namespace std;

    InterceptionContext context;
    InterceptionDevice device;
    InterceptionStroke stroke;

    wchar_t hardware_id[500];
    string buffer = "";
    //raise_process_priority();

    context = interception_create_context();


    interception_set_filter(context, interception_is_keyboard, INTERCEPTION_FILTER_KEY_UP | INTERCEPTION_FILTER_KEY_UP);



    while (interception_receive(context, device = interception_wait(context), &stroke, 1) > 0)
    {
        if (interception_is_keyboard(device))
        {
            InterceptionKeyStroke &keystroke = *(InterceptionKeyStroke *)&stroke;

            if (keystroke.code == SCANCODE_ESC) break;


        size_t length = interception_get_hardware_id(context, device, hardware_id, sizeof(hardware_id));


        if (wcsstr(hardware_id, L"04F3&PID_0009") == 0)
           interception_send(context, device, &stroke, 1); // Real Keyboard
        else
        {
            // RFID reader
            if (keystroke.code == 28)
            {
                std::cout << buffer << endl;
                  buffer = "";
            }
            else
                buffer = buffer + std::to_string(keystroke.code);


        }
        }
    }

    interception_destroy_context(context);

    return 0;
}

这三种方法都给了我同样的问题:

在阅读过程中有些键会随机丢失,而不是只有10个字符我只有8/9。

如果我在blocnote上使用rfid阅读器没有丢失任何字符,那么读者就没有问题。

所以我的问题是:如何确保挂钩上的窗口不会丢失任何消息/密钥,即使读取操作可能需要10秒钟。

感谢和美好的一天。

0 个答案:

没有答案