QT库中的原始输入 [英] Raw input in QT library
本文介绍了QT库中的原始输入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个基于QT的QWidget的应用程序。
使用QAbstractEventDispatcher()我过滤从Windows发送到我的应用程序的所有消息。但它们都不是WM_INPUT,我需要捕获原始输入。有谁知道为什么我的应用程序没有收到WM_INPUT消息?
I have bult an app based on QT's QWidget.
Using QAbstractEventDispatcher() I filter all messages sent from Windows to my application. But none of them are WM_INPUT, which I need to capture raw input. Does anyone know why my app doesn't receive WM_INPUT messages?
推荐答案
你需要调用 RegisterRawInputDevices [ ^ ]使用有效的设备规格来接收原始输入。
-Saurabh
You need to call RegisterRawInputDevices[^] with valid device specifications to receive raw input.
-Saurabh
我做。我使用类来操作原始数据(我从网上获取)。
显然无法尝试加载user32.dll。为什么会这样?所以我发现userN.dll已经被我在RegisterRawInputDevices之前被应用程序调用了。
代码:
I do. I am using a "class" to manipulate raw data(I got it from the net).
It apparently fails whan trying to load user32.dll.Why is that?So I found out user32.dll already get's called by the application before I RegisterRawInputDevices.
CODE:
BOOL init_raw_mouse(BOOL in_include_sys_mouse, BOOL in_include_rdp_mouse, BOOL in_include_individual_mice)
{
// "0" to exclude, "1" to include
int nInputDevices, i, j;
PRAWINPUTDEVICELIST pRawInputDeviceList;
static BOOL bHasBeenInitialized = 0;
int currentmouse = 0;
int nSize;
char *psName;
char buffer[80];
// Return 0 if rawinput is not available
//Right here. It tries to load user32.dll, but since my app already did, it won't load twice so the whole function fails.
HMODULE user32 = LoadLibrary("user32.dll");
if (!user32) return 0;
_RRID = (pRegisterRawInputDevices)GetProcAddress(user32,"RegisterRawInputDevices");
if (!_RRID) return 2;
_GRIDL = (pGetRawInputDeviceList)GetProcAddress(user32,"GetRawInputDeviceList");
if (!_GRIDL) return 3;
_GRIDIA = (pGetRawInputDeviceInfoA)GetProcAddress(user32,"GetRawInputDeviceInfoA");
if (!_GRIDIA) return 33;
_GRID = (pGetRawInputData)GetProcAddress(user32,"GetRawInputData");
if (!_GRID) return 4;
excluded_sysmouse_devices_count = 0;
nraw_mouse_count = 0;
if (bHasBeenInitialized) {
fprintf(stderr, "WARNING: rawmouse init called after initialization already completed.");
bHasBeenInitialized = 1;
return 0;
}
include_sys_mouse = in_include_sys_mouse;
include_rdp_mouse = in_include_rdp_mouse;
include_individual_mice = in_include_individual_mice;
// 1st call to GetRawInputDeviceList: Pass NULL to get the number of devices.
if (/* GetRawInputDeviceList */ (*_GRIDL)(NULL, &nInputDevices, sizeof(RAWINPUTDEVICELIST)) != 0) {
fprintf(stderr, "ERROR: Unable to count raw input devices.\n");
return 0;
}
// Allocate the array to hold the DeviceList
if ((pRawInputDeviceList = malloc(sizeof(RAWINPUTDEVICELIST) * nInputDevices)) == NULL) {
fprintf(stderr, "ERROR: Unable to allocate memory for raw input device list.\n");
return 0;
}
// 2nd call to GetRawInputDeviceList: Pass the pointer to our DeviceList and GetRawInputDeviceList() will fill the array
if (/* GetRawInputDeviceList */ (*_GRIDL)(pRawInputDeviceList, &nInputDevices, sizeof(RAWINPUTDEVICELIST)) == -1) {
fprintf(stderr, "ERROR: Unable to get raw input device list.\n");
return 0;
}
// Loop through all devices and count the mice
for (i = 0; i < nInputDevices; i++) {
if (pRawInputDeviceList[i].dwType == RIM_TYPEMOUSE) {
/* Get the device name and use it to determine if it's the RDP Terminal Services virtual device. */
// 1st call to GetRawInputDeviceInfo: Pass NULL to get the size of the device name
if (/* GetRawInputDeviceInfo */ (*_GRIDIA)(pRawInputDeviceList[i].hDevice, RIDI_DEVICENAME, NULL, &nSize) != 0) {
fprintf(stderr, "ERROR: Unable to get size of raw input device name.\n");
return 0;
}
// Allocate the array to hold the name
if ((psName = (char *)malloc(sizeof(TCHAR) * nSize)) == NULL) {
fprintf(stderr, "ERROR: Unable to allocate memory for device name.\n");
return 0;
}
// 2nd call to GetRawInputDeviceInfo: Pass our pointer to get the device name
if ((int)/* GetRawInputDeviceInfo */ (*_GRIDIA)(pRawInputDeviceList[i].hDevice, RIDI_DEVICENAME, psName, &nSize) < 0) {
fprintf(stderr, "ERROR: Unable to get raw input device name.\n");
return 0;
}
// Count this mouse for allocation if it's not an RDP mouse or if we want to include the rdp mouse
if (is_rm_rdp_mouse(psName)) {
if (include_rdp_mouse) nraw_mouse_count++;
}
else { // It's an ordinary mouse
nraw_mouse_count++;
if (!include_individual_mice) excluded_sysmouse_devices_count++; // Don't count this in the final nraw_mouse_count value
}
}
}
if (include_sys_mouse)
nraw_mouse_count++;
// Allocate the array for the raw mice
if ((raw_mice = malloc(sizeof(RAW_MOUSE) * nraw_mouse_count)) == NULL) {
fprintf(stderr, "ERROR: Unable to allocate memory for raw input mice.\n");
return 0;
}
// Define the sys mouse
if (include_sys_mouse) {
raw_mice[RAW_SYS_MOUSE].device_handle = 0;
raw_mice[RAW_SYS_MOUSE].x = 0;
raw_mice[RAW_SYS_MOUSE].y = 0;
raw_mice[RAW_SYS_MOUSE].z = 0;
raw_mice[RAW_SYS_MOUSE].is_absolute = 0;
raw_mice[RAW_SYS_MOUSE].is_virtual_desktop = 0;
currentmouse++;
}
// Loop through all devices and set the device handles and initialize the mouse values
for (i = 0; i < nInputDevices; i++) {
if (pRawInputDeviceList[i].dwType == RIM_TYPEMOUSE) {
// 1st call to GetRawInputDeviceInfo: Pass NULL to get the size of the device name
if (/* GetRawInputDeviceInfo */ (*_GRIDIA)(pRawInputDeviceList[i].hDevice, RIDI_DEVICENAME, NULL, &nSize) != 0) {
fprintf(stderr, "ERROR: Unable to get size of raw input device name (2).\n");
return 0;
}
// Allocate the array to hold the name
if ((psName = (char *)malloc(sizeof(TCHAR) * nSize)) == NULL) {
fprintf(stderr, "ERROR: Unable to allocate memory for raw input device name (2).\n");
return 0;
}
// 2nd call to GetRawInputDeviceInfo: Pass our pointer to get the device name
if ((int)/* GetRawInputDeviceInfo */ (*_GRIDIA)(pRawInputDeviceList[i].hDevice, RIDI_DEVICENAME, psName, &nSize) < 0) {
fprintf(stderr, "ERROR: Unable to get raw input device name (2).\n");
return 0;
}
// Add this mouse to the array if it's not an RDPMouse or if we wish to include the RDP mouse
if ((!is_rm_rdp_mouse(psName)) || include_rdp_mouse ) {
raw_mice[currentmouse].device_handle = pRawInputDeviceList[i].hDevice;
raw_mice[currentmouse].x = 0;
raw_mice[currentmouse].y = 0;
raw_mice[currentmouse].z = 0;
raw_mice[currentmouse].is_absolute = 0;
raw_mice[currentmouse].is_virtual_desktop = 0;
currentmouse++;
}
}
}
// free the RAWINPUTDEVICELIST
free(pRawInputDeviceList);
for (i = 0; i < nraw_mouse_count; i++) {
for (j = 0; j < MAX_RAW_MOUSE_BUTTONS; j++) {
raw_mice[i].buttonpressed[j] = 0;
// Create the name for this button
sprintf(buffer, "Button %i", j);
raw_mice[i].button_name[j] = (char *)malloc(strlen(buffer) + 1);
sprintf(raw_mice[i].button_name[j], "%s", buffer);
}
}
nraw_mouse_count -= excluded_sysmouse_devices_count;
// finally, register to recieve raw input WM_INPUT messages
if (!register_raw_mouse()) {
fprintf(stderr, "ERROR: Unable to register raw input (2).\n");
return 0;
}
bHasBeenInitialized = 1;
return 1;
}
来自此QT开发人员线程 [ ^ ]您应该使用-D _WIN32_WINNT = 0x501
(目标WinXP)重新编译QT,以便QEventDispatcherWin32
对WM_INPUT
消息作出反应,因此你可以处理它们。
欢呼,
AR
Hi,
From this QT developper thread[^] you should recompile QT with-D _WIN32_WINNT = 0x501
(target WinXP) so thatQEventDispatcherWin32
reacts toWM_INPUT
messages, and therefore you can handle them.
cheers,
AR
这篇关于QT库中的原始输入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文