У меня странная проблема в моем приложении C ++ WinAPI.
Когда я запускаю свое приложение, прокрутка работает, и я вижу MessageBox каждый раз, когда использую его.
Но затем я нажимаю здесь и там, меняю окно, возвращаюсь к моему и … все работает, кроме прокрутки мышью (программа не получает сообщения и не появляется MessageBox, в то время как, например, LBM, RBM и ключи работают просто отлично и программа реагирует на них).
Возможно, это связано с SetCapture / ReleaseCapture, который я выполняю во время программы? Если нет, то чем может быть вызвано такое странное поведение, когда все работает, за исключением прокрутки мыши (которая работает с самого начала).
У меня есть типичный цикл:
while(GetMessage (&msg, NULL, 0, 0) > 0){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
И мой обработчик событий:
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ){
switch(message){
case WM_MOUSEMOVE:
{
//fun stuff here
}
break;
case WM_MOUSEWHEEL:
{
MessageBox(NULL, L"MouseWheel", L"MouseWheel", NULL);
//even more fun stuff here
}
break;
case WM_CREATE:
{
}
break;
case WM_CTLCOLORSTATIC:
{
//...
return (LRESULT)GetStockObject(NULL_BRUSH);
}
break;
case WM_PAINT:
engine->render();
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
{
//fun stuff
}
break;
case WM_LBUTTONUP:
{
//fun stuff
}
break;
case WM_CHAR:
switch(wParam){
//...
}
break;
case WM_SETCURSOR:
view->refreshCursor();
break;
case WM_KEYDOWN:
switch (wParam){
/...
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Может быть, это потому, что мое окно не активно? ЛКМ будет работать, потому что он также сделает его активным. Но при наведении курсора (выполняется с помощью mousemove) мое окно не работает. Как захватить колесо мыши, даже когда окно не активно?
Отправляется в окно фокуса, когда колесо мыши вращается.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx
Других решений пока нет …