实现功能:电脑插了两个或多个鼠标,程序中需要区分不同鼠标的滚轮滚动消息。
实现方式:直接上代码,复制粘贴可用,具体处理逻辑可以根据实际需求进行修改和扩展,请注意,这段代码是在Windows操作系统下使用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 字段中提取滚动增量。根据增量值的正负来分别处理每个鼠标的向上滚动和向下滚动逻辑。