WM_MOUSEWHEEL перестает работать, в то время как другие события все еще работают в WinAPI (C ++)

0

У меня есть странная проблема в моем приложении 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) все еще работают, когда мое окно не активно. Как захватить колесо мыши, даже если окно не активно?

  • 0
    Вы пробовали spy ++, чтобы узнать, действительно ли событие не отправлено?
  • 0
    Сообщения от колеса мыши отправляются в окно с фокусом - если ваше окно не активно, то по определению оно не имеет фокуса.
Теги:
winapi
mouseevent
wndproc

1 ответ

2

Отправляется в окно фокусировки при вращении колеса мыши.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx

  • 0
    Но под WM_MOUSEMOVE я добавил SetFocus (hwnd); с тем же результатом. Кроме того, я получаю сообщения от mousemove (поэтому я нахожу на нем свои элементы).
  • 1
    @PolGraphic Бьюсь об заклад, ваш звонок SetFocus не активировал ваше окно, верно?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню