1

以下のコードがある場合、ウィンドウが閉じられたことを検出して終了するにはどうすればよいですか?r値を取得することはないようです。現在のウィンドウだけでなく、スレッド全体のメッセージを処理する必要があります。-1 0

HWND hWnd = CreateWindowExW(0, L"Edit", L"My Window", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, NULL, NULL);
ShowWindow(hWnd, SW_SHOWDEFAULT);
MSG msg;
BOOL r;
while ((r = GetMessageW(&msg, NULL, 0, 0)) != 0)
{
    if (r == -1) { break; }
    TranslateMessage(&msg);
    DispatchMessageW(&msg);
}
4

2 に答える 2

3

待つことr = -1は、ウィンドウが閉じたことを検出する方法ではありません。戻り値-1は通常の状態ではありません。これは、メッセージループでエラーが発生したことを示します。

ドキュメントから:

戻り値

タイプ:BOOL

関数が。以外のメッセージを取得する場合WM_QUIT、戻り値はゼロ以外です。

関数がWM_QUITメッセージを取得する場合、戻り値はゼロです。

エラーが発生した場合、戻り値は-1です。たとえば、hWndが無効なウィンドウハンドルであるかlpMsg、無効なポインタである場合、関数は失敗します。拡張エラー情報を取得するには、を呼び出しますGetLastError

GetMessageキューからメッセージを取得するとWM_QUIT、値0が返されるため、ループを終了する必要があります。

ウィンドウがいつ閉じたかを知りたいだけの場合は、WM_CLOSEまたはWM_DESTROYメッセージのいずれかを処理することをお勧めします。これらのメッセージの説明については、この質問への回答を参照してください。WindowsプログラムのWM_QUIT、WM_CLOSE、およびWM_DESTROYの違いは何ですか。

于 2011-02-04T00:34:13.707 に答える
0

私はこれに対する解決策を見つけました:WM_NULL
メッセージループは、以下とは関係なく、それ自体で問題を処理できますWndProc

// written in C# 
MSG msg = new MSG();
while (GetMessage(out msg, window, 0, 0))
{
    if ((msg.message == WM_NULL) && !IsWindow(window))
        break;
    TranslateMessage(ref msg);
    DispatchMessage(ref msg);
}
Console.WriteLine("yeah, out of loop ^^");

私の観察から:ウィンドウが破壊されると、一時停止せずにメッセージをGetMessage取得WM_NULLし(最初のヒント)IsWindow、ウィンドウをチェックできます(確認)。

于 2014-07-08T12:21:12.040 に答える