WINAPI postquitmessage离开窗口

时间:2016-05-04 07:25:16

标签: c++ winapi

我正在使用Dialog向用户询问输入信息,但我的窗口会挂起'用户完成后(控件不再响应,但它仍然可见)并且仅在应用程序退出时消失。

这是我的代码:

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;
}

消息循环:

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;
}

我的目的是在文本字段中检索一些数据作为" Connect"单击按钮,然后关闭窗口。

非常感谢您的回答。

1 个答案:

答案 0 :(得分:2)

当您直接使用WM_DESTROY消息调用自己的消息处理程序时,您将绕过任何需要由WINAPI框架完成的清理。相反,请使用DestroyWindow

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

进一步阅读的文章:Destroying Windows in WINAPI