2016-05-04 7 views
-1

Ich benutze einen Dialog, um den Benutzer nach einer Eingabe zu fragen, aber mein Fenster 'hängt' nachdem der Benutzer fertig ist (Steuerelemente reagieren nicht mehr, aber es ist immer noch sichtbar) und verschwindet nur wenn Die Anwendung wird beendet.WINAPI postquitmessage lässt Fenster hängen

Hier ist mein Code:

LRESULT CALLBACK Level2Auth(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { 
    switch (Message) 
    { 
     case WM_CREATE: 
     { 
      {... do stuff ...} 
      CreateWindow(L"BUTTON", L"Connect", 
       WS_VISIBLE | WS_CHILD | WS_BORDER, 
       370, 10, 70, 20, 
       hwnd, (HMENU)1, NULL, NULL); 
      break; 
     } 
     case WM_COMMAND: 
     { 
      switch (LOWORD(wParam)) 
      { 
      case 1: 
      { 
       {... retrieve input ...} 
       Level2Auth(NULL, WM_DESTROY, NULL, NULL); 
       break; 
      } 
      default: 
      { 
       break; 
      } 
      } 
      break; 
     } 
     case WM_DESTROY: 
     { 
      PostQuitMessage(0); 
      break; 
     } 
     default: 
      return DefWindowProc(hwnd, Message, wParam, lParam); 
    } 
    return 0; 
} 

Und die Nachrichtenschleife:

INT WINAPI launchLevel2Auth() 
{ 
    MSG Msg; HWND hwnd; 
    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, L"Level2AuthPopUp", L"Remote PKCS#11 PIN entry", WS_VISIBLE | WS_OVERLAPPEDWINDOW, 
     CW_USEDEFAULT, 
     CW_USEDEFAULT, 
     640, 
     100, 
     NULL, NULL, hInstance, NULL); 

    if (hwnd == NULL) { 
     return 0; 
    } 

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

    return Msg.wParam; 
} 

Meine Absicht war, einige Daten in einem Textfeld als „Connect“ Schaltfläche geklickt wurde abgerufen, und dann zu schließe das Fenster.

Vielen Dank für Ihre Antworten.

+0

Ich bin mir nicht sicher, aber ich glaube, ein Fenster hat unendlich WM_DESTROY Nachricht empfangen, weil ein PostQuitMessage-Code in WM_DESTROY geschweiften ... –

+0

Sie sagen Dialog, aber was Sie zeigen, ist ein Fenster Callback nicht ein Dialog Callback. –

+0

Meine schlechte, ich bin wirklich verloren mit WINAPI. – lieblo

Antwort

2

Wenn Sie Ihren eigenen Message-Handler mit der Nachricht WM_DESTROY direkt aufrufen, umgehen Sie alle Bereinigungen, die vom WINAPI-Framework ausgeführt werden müssen. Verwenden Sie stattdessen DestroyWindow:

... 
switch (LOWORD(wParam)) 
    { 
    case 1: 
     { 
     {... retrieve input ...} 
     DestroyWindow (hwnd); 
     // Level2Auth(NULL, WM_DESTROY, NULL, NULL); 
     break; 
     } 
    ... 

Artikel zur weiteren Lektüre: Destroying Windows in WINAPI.