查看Win32消息

时间:2012-04-04 14:36:19

标签: c++ c winapi

大家好我是windows32编程的新手,我有几个问题 - :

当我在程序中使用以下代码时,它工作正常 - :

while(GetMessage(&msg,NULL,0,0))
  {
    TranslateMessage(&msg);                                  
    DispatchMessage(&msg);  
}

但是当我将GetMessage的null替换为hwnd(刚刚创建的窗口的句柄)时,似乎没有关闭它仍然在后台运行。为什么当我用hwnd替换NULL时会发生这种情况意味着我只接收一个窗口的消息然后为什么它不起作用????

while(GetMessage(&msg,hwnd,0,0))
  {
    TranslateMessage(&msg);                                  
    DispatchMessage(&msg);  
}

顺便说一句,windows函数是 - :

LRESULT CALLBACK WinProc(HWND hWnd, UINT message,
                              WPARAM wparam, LPARAM lparam){

    switch(message){
                case WM_DESTROY:
                     PostQuitMessage(0);
                     break;
                default:
                return DefWindowProc(hWnd, message, wparam, lparam);
                }
    return 0;
} 

其次 - :

有什么方法可以看到发送到任何特定窗口的所有消息????

第三 - :

编译我的Windows程序时编写__stdcall(WINAPI)的原因是什么?

快速回复将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:3)

  1. GetMessage仅在收到0时返回WM_QUIT(使循环结束),但WM_QUIT未与任何特定窗口关联,因此如果您GetMessage仅询问某个hWnd的消息,则永远不会收到。

  2. 如果它是你的窗口,你已经在他们的窗口程序中看到了它们;如果您想在将它们分配到窗口过程之前对其进行过滤,则可以在调用msg之前检查GetMessage填充的DispatchMessage结构。

  3. 整个Windows API使用stdcall调用约定(我认为因为它比通常的cdecl稍快一点/产生更少的样板代码),所以你的回调也必须遵循该调用惯例。请注意,您必须仅对Windows API函数调用的函数使用WINAPI(即stdcall),对于其他您可以自由使用您最喜欢的调用约定的函数。

    < / LI>

答案 1 :(得分:1)

PostQuitMessage生成WM_QUIT,由消息队列处理,但不与特定窗口关联。通过仅调用hwnd来电中的GetMessage条消息,您不会处理WM_QUIT

关于查看发送到窗口/线程/进程的所有消息,请参阅https://stackoverflow.com/questions/4038730/i-am-looking-for-a-windows-spy-application

最后,关于__stdcall,请参阅What does "WINAPI" in main function mean?