2010-12-22 48 views
2

可能只是一種粗略的疏忽,但我沒有收到消息循環中的任何WM_SIZE消息。但是,我確實在WndProc中收到了它們。我認爲Windows循環給WndProc發送消息?Windows消息Bizarreness

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 
     // this message is read when the window is closed 
    case WM_DESTROY: 
     { 
      // close the application entirely 
      PostQuitMessage(0); 
      return 0; 
     } break; 
    case WM_SIZE: 
     return 0; 
     break; 
    } 
    printf("wndproc - %i\n", message); 
    // Handle any messages the switch statement didn't 
    return DefWindowProc (hWnd, message, wParam, lParam); 
} 

...現在的消息循環...

while(TRUE) 
{ 
    // Check to see if any messages are waiting in the queue 
    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    { 

     // translate keystroke messages into the right format 
     TranslateMessage(&msg); 
     // send the message to the WindowProc function 
     DispatchMessage(&msg); 

     // check to see if it's time to quit 
     if(msg.message == WM_QUIT) 
     { 
      break; 
     } 
     if(msg.message == WM_SIZING) 
     { 
      printf("loop - resizing...\n"); 
     } 
    } 
    else 
    { 
     //do other stuff 
    } 
} 

回答

7

如果消息是由系統,同時它在DefWindowProc函數或其他地方在陰曹地府那是Windows的消息隊列發送到你的窗口,那麼消息循環根本不會看到該消息。

請注意,這僅適用於發送的消息。發佈的消息將顯示在消息循環中。

如果要過濾所有消息,請使用帶有線程ID的SetWindowsHookEx以及相應的鉤子類型。或者更好的是,在WndProc中正確處理它們。

+0

另外...如果你自己的窗口用戶界面線程爲自己做了顯式或隱式的SendMessage(例如在處理另一個消息時),它也不會排隊,它會通過一些內部函數並最終調用你的WndProc直接。例如,這就是爲什麼你可以在你的WM_CREATE中使用SetWindowText的原因。 – martona 2010-12-22 03:43:56

3

雖然你已經掌握了大小夾具,但我相信Windows正在運行它自己的消息循環。這將發送到您的消息隊列,但在調整大小的過程中,您的循環不在圖片中。

框架窗口將調用SetCapture捕獲所有後續的鼠標消息。然後當鼠標移動時它會調整窗口大小。它也將泵送消息循環;你可以在這裏看到一些類似的代碼:ftp://ftp.ringdale.com/support/Nlynx/Tech%20Support%20Docs/Midrange/EmeraldSeries/ADK/DDE/C/APITERM/TRACK.C。請注意該函數中間的消息循環。

它自己抽取隊列,以便調整大小代碼不必返回,直到調整大小跟蹤完成後。我調出跟蹤矩形代碼,因爲這是窗口調整大小用於工作,只顯示窗口的一個細長的輪廓,直到我們有動態窗口調整大小,當您調整大小時,整個窗口動態更新。內部行爲可能類似。

編輯2:仍然,信貸的人提到張貼與發送的消息...發送的消息將永遠不會通過消息泵。發送消息迅速歸結爲您的wnd proc函數調用。除非它們被髮送到另一個線程所擁有的窗口,這變得更加複雜;它們被添加到屬於目標線程的消息隊列的內部隊列中,並且在內部處理 - 在發佈的消息被返回之前 - 在GetMessage中。獲取發送的消息的返回值回到源線程涉及更多回轉:)

0

WM_SIZING和WM_SIZE不是相同的消息。我認爲調整窗口大小的普通鼠標操作首先發送WM_SIZING消息,但是如果某個程序發送了WM_SIZE消息,那麼您只會在沒有WM_SIZING的情況下獲取WM_SIZE消息。