1

みなさん、こんにちは Windows32 プログラミングの初心者で、いくつか質問があります。

プログラムで次のコードを使用すると、正常に動作します-:

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

しかし、GetMessage の null を hwnd (作成したばかりのウィンドウのハンドル) に置き換えると、閉じていないように見えますが、バックグラウンドで実行されたままです。NULL を hwnd に置き換えると、なぜこれが発生するのかというと、1 つのウィンドウに対してのみメッセージを受信して​​いるのに、なぜ機能しないのですか??

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は、 を受信した場合にのみ戻ります0(ループを終了させます)WM_QUITが、は特定のウィンドウに関連付けられていないため、特定の のメッセージのみを要求するWM_QUITがある場合は受信されません。GetMessagehWnd

  2. 自分のウィンドウの場合は、ウィンドウ プロシージャ内に既に表示されています。それらをウィンドウ プロシージャにディスパッチする前にそれらをフィルター処理する場合は、 を呼び出す前に、によって設定されたmsg構造を確認できます。GetMessageDispatchMessage

  3. Windows API全体がstdcall呼び出し規約を使用しているため(通常よりもわずかに高速であり、生成される定型コードが少ないためだと思いますcdecl)、コールバックもその呼び出し規約に従う必要があります。Windows API 関数によって呼び出される関数でのみ使用WINAPI(つまり)する必要があることに注意してください。他の関数については、好きな呼び出し規則を自由に使用できます。stdcall

于 2012-04-04T14:42:48.677 に答える
1

PostQuitMessageWM_QUITメッセージキューによって処理されるが、特定のウィンドウに関連付けられていないものを生成します。hwndへの呼び出しでメッセージのみをフィルタリングするとGetMessage、 は処理されませんWM_QUIT

ウィンドウ/スレッド/プロセスに送信されるすべてのメッセージの表示については、https://stackoverflow.com/questions/4038730/i-am- looking-for -a-windows-spy-application を参照してください。

最後に、 については、メイン関数の「WINAPI」とはどういう意味ですか?__stdcallを参照してください。

于 2012-04-04T14:38:16.410 に答える