2011-02-04 5 views
1

以下のコードをお持ちの場合は、ウィンドウが閉じられた時点を検出して終了できますか? r値を得ることは決してありません -1 0、私は現在のウィンドウだけでなくスレッド全体のメッセージを処理する必要があります。Win32メッセージループ:GetMessage(&msg、NULL、0、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); 
} 

答えて

3

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

戻り値

型:関数がWM_QUIT以外のメッセージを取得BOOL

場合、戻り値が非ゼロです。

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

エラーがある場合、戻り値は-1です。たとえば、hWndが無効なウィンドウハンドルまたはlpMsgが無効なポインタの場合、関数は失敗します。拡張エラー情報を取得するには、GetLastErrorに電話してください。

GetMessageがキューからWM_QUITメッセージを取得し、それが0の値を返します、そしてあなたは、ループを終了する必要があります。

ウィンドウが閉じられたことを知りたい場合は、おそらくWM_CLOSEまたはWM_DESTROYのいずれかのメッセージを処理する必要があります。これらのメッセージの説明については、What is the difference between WM_QUIT, WM_CLOSE, and WM_DESTROY in a windows program?

+1

申し訳ありませんが、私は完全に 'r == -1'が近い条件ではないことを忘れています。しかし、 'r == 0'で終了することも想定されていませんか?どのようにそれをやっていないのですか? (ところで、私は 'WM_QUIT'は決してループに送られません) – Mehrdad

+0

@Mehrdad:私の答えは、' WM_QUIT'が決してメッセージループに送られないように言いました。 'GetMessage'が' WM_QUIT'を取得した場合は、値0を返します。おそらく問題はあなたが決して* WM_QUITメッセージを送信しないということです。ウィンドウが閉じている場合は、ケースを処理し、['PostQuitMessage'関数](http://msdn.microsoft.com/en-us/library/ms644945.aspx)を使用してループを終了する必要があることを示す必要があります。 –

+0

ああ待って...私はそれを送信する必要がある場合、私は複数のウィンドウを開いている間に、私は最後のウィンドウであるかどうかを知っているので、WndProcから送信する必要がありますか?それはかなり醜いになるの追跡をしないのですか? – Mehrdad

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は(ウィンドウを確認することができます肯定)。

関連する問題