2010-12-22 73 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消息。