Я пытаюсь сделать небольшую указательную задачу в C ++. Я создал GUI с помощью Qt. В приложении я заменяю курсор на нарисованную точку на QWidget. Так что позже я могу манипулировать движением курсора. На каждом Mouseevent я делаю обновление. Проблема в том, что очень важно регистрировать все движения мыши. Даже RawInputData мыши, поэтому нужны собственные события Windows. Когда я использую встроенные обработчики событий из Qt, проблема заключается в том, что мой поток блокируется при обновлении виджета. Поэтому попытался разделить обработку событий и рисование в двух разных потоках. Но это кажется очень трудным. Поэтому моей второй идеей было создать невидимое окно 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);
}
}
Я был бы рад любым предложениям или идеям.