2013-11-21 3 views
0

У меня странная проблема в моем приложении WinAPI на C++.WM_MOUSEWHEEL перестает работать, пока в WinAPI (C++) все еще работает.

Когда я запускаю свое приложение, прокрутка работает, и я вижу MessageBox каждый раз, когда я его использую. Но тогда я нажимаю здесь и там, меняю окно, возвращаюсь к моему и ... все работает, за исключением прокрутки мыши (программа не получает сообщение и не появляется MessageBox, в то время как, например, LBM, RBM и клавиши работают просто отлично и программа реагирует на них).

Возможно, это связано с установкой SetCapture/ReleaseCapture, которую я выполняю во время программы? Если нет, то что может вызвать такое странное поведение, когда все работы задерживаются на мышином прокрутке (который работает с самого начала).

У меня есть цикл typicall:

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 ++ найти ли событие действительно не отправляется? – PMF

+0

Сообщения о колесиках мыши отправляются в окно с фокусом - если ваше окно неактивно, то по определению оно не имеет фокуса. –

ответ

2

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

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

+0

Но под WM_MOUSEMOVE я добавил SetFocus (hwnd); с тем же результатом. Также я получаю сообщения от mousemove (поэтому я нахожу на нем свои элементы). – PolGraphic

+1

@PolGraphic Я уверен, ваш звонок SetFocus не активировал ваше окно, верно? – manuell

+0

Я думаю, это правда. Когда я нажимаю на окно, он получает фокус, когда я использую SetFocus или SetActiveWindow, мое окно по-прежнему не «сверху» («активно»). – PolGraphic