У меня есть 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.
Когда вы регистрируете ловушку с 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 чтобы ввести отпускание левой кнопки.
Я не думаю, что сырая альтернатива является хорошей идеей. Я вижу это в качестве крайней меры.
Тачпад — это просто мышь, как и любая другая. Он генерирует стандартные события мыши. Используйте глобальный WH_MOUSE
через SetWindowsHookEx()
захватывать события мыши во всем мире. Чтобы воспроизвести их, используйте mouse_event()
, В качестве альтернативы используйте WH_JOURNALRECORD
а также WH_JOURNALPLAYBACK
крючки вместо для захвата и воспроизведения, соответственно.
Для щелчка мыши и перемещения мыши — когда вы обрабатываете ввод от HID, используйте SendInput метод.
Нажать легко, для перемещения мыши попробуйте получить масштабированные координаты перетаскивания и преобразовать их в текущие координаты масштаба экрана, а также использовать SendInput
метод.
Также вы можете отследить смещение по x, y и выполнить соответствующую калибровку, чтобы перевести их на экран x, y.