使用C++转换USB人机接口设备中的事件
Convert events from a USB human interface device using C++
我有一个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 = %dn", 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在windows系统上的Chromium实例中播放。
当您用WH_MOUSE_LL注册钩子时,wparam的可能值为:WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE、WM_MOUSEWHEEL、WM_MUSEWHEEL、WM_RBUTTONOWN或WM_RBUTTONUP。
我预计,一旦发出WM_LBUTTONDOWN,就必须发出相应的WM_LBUTTUNUP以防止光标进入拖动状态。
我没有设备来测试这个,但我会尝试下面的调用,以防止进入拖动状态。
CallNextHookEx(hMouseHook, nCode, WM_LBUTTONUP, lParam);
或者将mouse_event
与MOUSEEVENTF_LEFTUP一起使用来注入左按钮的释放。
我不认为原始输入替代方案是个好主意。我认为这是不得已的措施。
触摸板就像其他鼠标一样。它生成标准的鼠标事件。通过SetWindowsHookEx()
使用全局WH_MOUSE
挂钩全局捕获鼠标事件。要重播它们,请使用mouse_event()
。或者,分别使用WH_JOURNALRECORD
和WH_JOURNALPLAYBACK
挂钩进行捕获和播放。
对于鼠标点击和鼠标移动-当您处理来自HID的输入时,请使用SendInput方法。
点击很容易,对于鼠标移动,尝试获得缩放后的拖动坐标,并将其转换为当前屏幕缩放坐标,还可以使用SendInput
方法。
您还可以跟踪x,y中的位移,并进行适当的校准,将其转换为屏幕x,y
- Android NDK传感器向事件队列报告奇怪的间隔
- 从文本文件中读取时钟时间和事件时间并进行处理
- WMI检测进程创建事件-c++
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- Visual C++GC接口如何启用它以及要包含哪个库
- Windows.h与GLFW.h的接口
- 处理闪烁窗口事件
- C++Builder中的OnClick事件签名存在问题
- 跟踪滚动条上的鼠标事件
- 什么是事件表 (wxWidgets)?
- 如何在 MFCaptureEngine 中获取"Camera removed"事件
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 提供与TMP和SFINAE的通用接口
- 给定顺序中的事件处理
- 带有函数指针的c++事件处理接口
- 为什么Boost.Asio不支持基于事件的接口
- c++或c#:从人机接口设备(HID)读取命令
- 命令行接口-使用Midi库分析事件并存储在矢量C++中
- 使用C++转换USB人机接口设备中的事件