У меня есть странная проблема в моем приложении 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;
}
Может быть, потому, что мое окно неактивно? LMB будет работать, потому что он также сделает его активным. Но зависания (сделанные с mousemove) все еще работают, когда мое окно не активно. Как захватить колесо мыши, даже если окно не активно?
Отправляется в окно фокусировки при вращении колеса мыши.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx