1

大家好,我是 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) 的原因是什么????

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

4

2 回答 2

3
  1. GetMessage仅当它接收到 a 时才返回0(使循环结束)WM_QUIT,但 aWM_QUIT不与任何特定窗口相关联,因此如果您有 aGetMessage只询问某个特定的消息,则永远不会收到它hWnd

  2. 如果它是您的窗口,您已经在它们的窗口过程中看到它们;如果您想在将它们分派到它们的窗口过程之前过滤它们,您可以在调用之前检查msg填充的结构。GetMessageDispatchMessage

  3. 整个 Windows API 使用stdcall调用约定(我认为是因为它比通常的更快/产生的样板代码更少cdecl),因此您的回调也必须遵循该调用约定。请注意,您必须仅在由 Windows API 函数调用的函数上使用WINAPI(ie ),而对于其他函数,您可以自由使用您最喜欢的任何调用约定。stdcall

于 2012-04-04T14:42:48.677 回答
1

PostQuitMessage生成WM_QUIT由消息队列处理,但不与特定窗口关联的消息。通过仅过滤hwnd呼叫中的消息GetMessage,您无需处理WM_QUIT.

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

最后,关于__stdcall,请参阅main 函数中的“WINAPI”是什么意思?

于 2012-04-04T14:38:16.410 回答