我尝试在C ++中完成一些指向任务。我用Qt创建了GUI。在应用程序中,我将光标替换为QWidget上的自绘点。所以以后我可以操纵光标的移动。在每个Mouseevent上,我都会进行更新。问题是,记录所有鼠标的移动非常重要。即使是鼠标的RawInputData,也需要本机Windows事件。当我使用Qt的本机事件处理程序时,问题是,更新Widget时我的线程被阻止了。因此,尝试将事件处理和绘图分开在两个不同的线程中。但这似乎很困难。因此,我的第二个想法是创建一个不可见的Windows窗口,该窗口捕获所有信息,然后将它们交给Qt处理。但是我无法制作这样的Windows窗口。目前,我还没有收到任何消息。以后它应该在后台运行。
我的Qt尝试:
bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result) {
MSG *msg = (MSG*)message;
switch(msg->message)
{
case WM_INPUT: {
POINT lpPoint;
GetCursorPos(&lpPoint);
xCursor = lpPoint.x;
yCursor = lpPoint.y;
//std::cerr << "Cursor: X: " << lpPoint.x << " || Y: " << lpPoint.y << std::endl;
UINT dwSize;
GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT, NULL, &dwSize,
sizeof(RAWINPUTHEADER));
LPBYTE lpb = new BYTE[dwSize];
if (lpb == NULL)
{
return 0;
}
if (GetRawInputData((HRAWINPUT)msg->lParam, RID_INPUT, lpb, &dwSize,
sizeof(RAWINPUTHEADER)) != dwSize )
OutputDebugString (TEXT("GetRawInputData does not return correct size !\n"));
RAWINPUT* raw = (RAWINPUT*)lpb;
if(raw->header.dwType == RIM_TYPEMOUSE) {
//std::cerr << "RAW: X: " << raw->data.mouse.lLastX << " || Y: " << raw->data.mouse.lLastY << std::endl;
}
delete[] lpb;
update();
return false;
}
default:{
//std::cerr << "other Message" << std::endl;
return false;
}
}
}
我的消息窗口:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
std::cerr << "callback" << std::endl;
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int main(int argc, char *argv[])
{
const char CLASS_NAME[] = "Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = GetModuleHandle(NULL);
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
// Create the window.
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
"Learn to Program Windows", // Window text
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
HWND_MESSAGE, // Parent window
NULL, // Menu
GetModuleHandle(NULL), // Instance handle
NULL // Additional application data
);
if (hwnd == NULL)
{
return 0;
}
MSG msg;
while (GetMessage(&msg, hwnd, 0 ,0)) {
std::cerr << "Message received!" << std::endl;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
我将很高兴收到任何意见或建议。