簡體   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