实现功能 :电脑插了两个或多个鼠标,程序中需要区分不同鼠标的滚轮滚动消息。
实现方式:直接上代码,复制粘贴可用,具体处理逻辑可以根据实际需求进行修改和扩展,请注意,这段代码是在Windows操作系统下使用C语言实现的。
c
#include <Windows.h>
#include <iostream>
using namespace std;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_INPUT:
{
HRAWINPUT hRawInput = (HRAWINPUT)lParam;
RAWINPUT rawInput;
UINT dataSize = sizeof(rawInput);
if (GetRawInputData(hRawInput, RID_INPUT, &rawInput, &dataSize, sizeof(RAWINPUTHEADER)) != -1)
{
if (rawInput.header.dwType == RIM_TYPEMOUSE)
{
if (rawInput.data.mouse.usButtonFlags == RI_MOUSE_WHEEL)
{
short delta = (short)rawInput.data.mouse.usButtonData;
if (delta > 0) {
// 鼠标向上滚动
// 在这里处理向上滚动的逻辑
}
else {
// 鼠标向下滚动
// 在这里处理向下滚动的逻辑
}
//检查设备标识符或句柄以区分不同鼠标
if (rawInput.header.hDevice == /* 鼠标1的设备标识符或句柄 */)
{
// 鼠标1的滚轮滚动事件
// 执行相应的操作
printf("Mouse 1 scrolled!\n");
}
else if (rawInput.header.hDevice == /* 鼠标2的设备标识符或句柄 */)
{
// 鼠标2的滚轮滚动事件
// 执行相应的操作
printf("Mouse 2 scrolled!\n");
}
else
{
// 其他鼠标的滚轮滚动事件
// 执行相应的操作
printf("Unknown mouse scrolled!\n");
}
}
}
}
break;
}
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
int main()
{
// 创建窗口类并注册
WNDCLASS wc = { 0 };
wc.lpfnWndProc = WindowProc;
wc.hInstance = GetModuleHandle(NULL);
wc.lpszClassName = "MyWindowClass";
RegisterClass(&wc);
// 注册原始输入设备
RAWINPUTDEVICE rawInputDevice;
rawInputDevice.usUsagePage = 1;
rawInputDevice.usUsage = 2;
rawInputDevice.dwFlags = RIDEV_INPUTSINK;
if (RegisterRawInputDevices(&rawInputDevice, 1, sizeof(RAWINPUTDEVICE)) == FALSE)
{
cout << "register err" << endl;
return -1;
}
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
cout << "end" << endl;
return 0;
}
这段代码使用Raw Input API来捕获鼠标输入。在 WM_INPUT 消息处理中,它检查设备标识符以区分不同的鼠标。然后,它检查 usButtonFlags 字段来识别滚轮滚动消息,并从 usButtonData 字段中提取滚动增量。根据增量值的正负来分别处理每个鼠标的向上滚动和向下滚动逻辑。