случайный ввод потерянного ключа на хуках

У меня есть 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 (слишком много кода, чтобы показать)

библиотека перехвата облита

самое интересное решение, которое я буду использовать, если я решу проблему

#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.

если я использую RFID-ридер в Blocnote, ни один персонаж не теряется, поэтому нет проблем с ридером.

поэтому мой вопрос: как сделать так, чтобы окна / крючки не теряли ни одно сообщение / ключ, даже если операция чтения может занять 10 секунд.

спасибо и хорошего дня

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]