-1

メッセージキューからメッセージを正常に受信し、コードに従ってそれらを処理するために wndproc を取得しようとしましたが、希望どおりに動作していません。どのウィンドウを受信したかを判断したいのです。 WM_DESTROY または WM_CLOSE と、閉じられたウィンドウに固有のコードを呼び出しますが、何らかの理由で現時点では何もしていません。多くの実験の後、部分的に異なる方法で機能するようになりましたが、各実装が正しく機能していないようです。これが私の最後の失敗したコードです:

    while (GetMessage (&messages, NULL, 0, 0))
{
    /* Translate virtual-key messages into character messages */
    TranslateMessage(&messages);
    /* Send message to WindowProcedure */
    DispatchMessage(&messages);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */


LRESULT CALLBACK Proc2(HWND mainwin, UINT message, WPARAM wParam, LPARAM lParam )
{
switch (message)                  /* handle the messages */
{
                       case WM_DESTROY:
                       const HWND active_window = GetActiveWindow();
                       if (active_window == mainwin)
                                {
                                   PostQuitMessage(0);
                                }
                                   if (active_window == hwnd2)
                                   {
                                                 PostQuitMessage(0);
                                                EnableWindow (mainwin, true);
                                   }
                                   break;
} 
 switch (wParam)                  /* handle the messages */
{
              case ID_2 :
            PostQuitMessage(0);
            break;
              case ID_1 :
               ShowWindow (hwnd2, SW_SHOW);     
               break;
                            default:                      /* for messages that we don't deal with */
        return DefWindowProc (mainwin, message, wParam, lParam); 
                    break;
}  

    return 0;
}    

複数のウィンドウプロシージャで試したコードは次のとおりです

while (GetMessage (&messages, NULL, 0, 0))
{
    /* Translate virtual-key messages into character messages */
    TranslateMessage(&messages);
    /* Send message to WindowProcedure */
    DispatchMessage(&messages);
}

/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */


LRESULT CALLBACK Proc2(HWND mainwin, UINT message, WPARAM wParam, LPARAM lParam )
{
switch (message)                  /* handle the messages */
{
                       case WM_DESTROY:
                                   PostQuitMessage(0);
                                   break;
} 
 switch (wParam)                  /* handle the messages */
{
              case ID_2 :
            PostQuitMessage(0);
            break;
              case ID_1 :
               ShowWindow (hwnd2, SW_SHOW);     
               break;
                            default:                      /* for messages that we don't deal with */
        return DefWindowProc (mainwin, message, wParam, lParam); 
                    break;
}  

    return 0;
}    
LRESULT CALLBACK Proc3(HWND hwnd2, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
           case WM_DESTROY:
EnableWindow (mainwin, false);
                break;
case WM_CLOSE:
EnableWindow (mainwin, false);
break;
}
switch (wParam)
{
   default:
           return DefWindowProc (hwnd2, message, wParam, lParam);
           break;
           }
           return 0;
           }
4

1 に答える 1

1

あなたは言う、

「私がやりたいのは、どのウィンドウが WM_DESTROY または WM_CLOSE を受け取ったかを判断することです」

簡単な答えは、受信しているウィンドウUINT messageHWND mainwin.

HWND mainwin「はい、でも私のウィンドウはどれですか?」と知りたい場合は、そのための 1 つの方法は、ウィンドウを作成するときに、そのウィンドウ ハンドルが何であるかを覚えておき、それをどこかに (たとえば、グローバル変数として) 保存することです。


それとは別に、なぜ を呼び出しているGetActiveWindow()のか、どの機能を実装したいのかが明確ではありません。

于 2012-12-06T13:20:25.197 に答える