winapi — Конвертируйте события с устройства с интерфейсом USB, используя переполнение стека

У меня есть USB HID тачпад, который собирает данные. По умолчанию при нажатии на тачпад генерируется возврат каретки (Enter), и когда я пытаюсь использовать его как мышь, он на самом деле вводит перетаскивание государство.

Что я хочу сделать, это преобразовать возврат каретки в щелчок мыши событие и перетаскивание состояние в перемещение курсора без начальной щелкающей части.

Я нашел сырой ввод альтернатива. Тем не менее, я не знаю, как преобразовать его в мышь щелчок и курсор переехать.

Вот код, ответственный за «чтение» мыши:

LRESULT CALLBACK mouseProc (int nCode, WPARAM wParam, LPARAM lParam)
{
MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
if (pMouseStruct != NULL)
{
if(wParam == WM_LBUTTONDOWN)
{
cout<<"clicked"<<endl;
}
printf("Mouse position X = %d  Mouse Position Y = %d\n", pMouseStruct->pt.x,pMouseStruct->pt.y);

stringstream sx, sy;
sx << (int) pMouseStruct->pt.x << endl;
sy << (int) pMouseStruct->pt.y << endl;
}
return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}

затем часть клавиатуры:

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
return CallNextHookEx(NULL, nCode, wParam, lParam);

tagKBDLLHOOKSTRUCT *str = (tagKBDLLHOOKSTRUCT *)lParam;

cout<<str->vkCode<<endl;

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

затем часть регистрации:

DWORD WINAPI MyLogger(LPVOID lpParm)
{

HINSTANCE hInstance = GetModuleHandle(NULL);
hMouseHook = SetWindowsHookEx( WH_MOUSE_LL, mouseProc, hInstance, NULL );
hKeyHook = SetWindowsHookEx( WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, NULL );

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

UnhookWindowsHookEx(hMouseHook);
return 0;
}

Примечание: я не знаю, относится ли это к делу, но я хочу использовать HID для воспроизведения в экземпляре Chromium в системе Windows.

8

Решение

Когда вы регистрируете ловушку с WH_MOUSE_LL, возможные значения WPARAM являются: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_MOUSEHWHEEL, WM_RBUTTONDOWN или WM_RBUTTONUP.

Я ожидаю, что когда-то WM_LBUTTONDOWN выпущен, соответствующий WM_LBUTTONUP должен быть выдан чтобы курсор не входил в состояние перетаскивания.

У меня нет устройства для проверки этого, но я бы попробовал позвонить ниже, чтобы предотвратить переход в состояние перетаскивания.

CallNextHookEx(hMouseHook, nCode, WM_LBUTTONUP, lParam);

или использовать mouse_event с MOUSEEVENTF_LEFTUP чтобы ввести отпускание левой кнопки.

Я не думаю, что сырая альтернатива является хорошей идеей. Я вижу это в качестве крайней меры.

2

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

Тачпад — это просто мышь, как и любая другая. Он генерирует стандартные события мыши. Используйте глобальный WH_MOUSE через SetWindowsHookEx() захватывать события мыши во всем мире. Чтобы воспроизвести их, используйте mouse_event(), В качестве альтернативы используйте WH_JOURNALRECORD а также WH_JOURNALPLAYBACK крючки вместо для захвата и воспроизведения, соответственно.

2

Для щелчка мыши и перемещения мыши — когда вы обрабатываете ввод от HID, используйте SendInput метод.

Нажать легко, для перемещения мыши попробуйте получить масштабированные координаты перетаскивания и преобразовать их в текущие координаты масштаба экрана, а также использовать SendInput метод.

Также вы можете отследить смещение по x, y и выполнить соответствующую калибровку, чтобы перевести их на экран x, y.

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