如何从另一个线程正确销毁 window 即 运行?

How to correctly destroy window that is running from another thread?

我试图实现的目标是监听有关锁定、解锁等的会话通知。由于体系结构和避免阻塞主线程,我必须在另一个线程中执行此操作。这是我正在做的事情:


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
    case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_WTSSESSION_CHANGE:
        switch (wParam) {
        case WTS_CONSOLE_CONNECT:
        case WTS_SESSION_LOGON:
        case WTS_REMOTE_CONNECT:
        case WTS_SESSION_UNLOCK:
        case WTS_CONSOLE_DISCONNECT:
        case WTS_REMOTE_DISCONNECT:
        case WTS_SESSION_LOGOFF:
        case WTS_SESSION_LOCK:
        case WTS_SESSION_REMOTE_CONTROL:
        case WTS_SESSION_CREATE:
        case WTS_SESSION_TERMINATE:

            break;
        default:
            break;
        }
        break;
    default:
        return DefWindowProc(hwnd, msg, wParam, lParam);
    }

    return 0;
}

void startListeningNotifications()
{
    const wchar_t g_szClassName[] = L"myWindowClass";

    WNDCLASSEX wc = {};
    wc.lpfnWndProc = WndProc;
    wc.lpszClassName = g_szClassName;
    wc.cbSize = sizeof(WNDCLASSEX);

    if (!RegisterClassEx(&wc))
    {
        return;
    }

    HWND hwnd = CreateWindowEx(NULL, g_szClassName, L"", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, NULL, NULL, GetModuleHandle(NULL), NULL);
    if (hwnd == NULL)
    {
        return;
    }

    if (!WTSRegisterSessionNotification(hwnd, NOTIFY_FOR_ALL_SESSIONS))
    {
        return;
    }

    ShowWindow(hwnd, SW_HIDE);

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

int main()
{
    std::thread listener(startListeningNotifications);
    listener.join();

    return 0;
}

我现在面临的问题是我不知道如何正确编写 stopListeningNotifications() 方法。我不得不以某种方式销毁我的 window 并退出消息循环。请建议如何安全地做到这一点。提前致谢。

已提供 WndProc 函数句柄 WM_CLOSEWM_DESTROY

case WM_CLOSE:
        DestroyWindow(hwnd);
        break;
case WM_DESTROY:
        PostQuitMessage(0);
        break;

因此您可以发送 WM_CLOSE 消息,其中包含在线程中创建的 window 的 hwnd

PostMessage(hwnd, WM_CLOSE, 0, 0)