繁体   English   中英

查看 Win32 消息

[英]Viewing Win32 messages

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

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

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

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

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

顺便说一下 windows function 是:

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;
} 

第二-:

有什么办法可以看到发送到任何特定 window 的所有消息????

第三-:

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

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

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

  2. 如果它是你的 window,你已经在他们的 window 过程中看到他们; 如果你想在将它们分派到它们的 window 过程之前过滤它们,你可以在调用DispatchMessage之前检查由GetMessage填充的msg结构。

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

PostQuitMessage生成WM_QUIT ,它由消息队列处理,但不与特定的 window 关联。通过在调用GetMessage时仅过滤hwnd消息,您不会处理WM_QUIT

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM