Как я могу обнаружить разрушение окна из основного потока? - PullRequest
0 голосов
/ 19 февраля 2011

Как правило, оконная процедура для "основного" класса окна будет вызывать PostQuitMessage в ответ на сообщение WM_DESTROY.

Я бы предпочел, чтобы основной поток решал, когда он хочет завершить, основываясь на сроке службы окна, которое он создает. Таким образом, любой класс окна, который я выберу в качестве главного окна, может иметь общую оконную процедуру, в которой нет PostQuitMessage.

while(GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);

    if(msg.hwnd == hWnd && msg.message == WM_DESTROY)
    {
        PostQuitMessage(0);
    }
}

Выше приведена моя попытка, но сообщение WM_DESTROY никогда не отправляется в очередь сообщений, похоже, оно является внутренним для оконной процедуры.

Есть ли способ сделать это?

Ответы [ 2 ]

5 голосов
/ 19 февраля 2011

WM_DESTROY отправляется отправлено , а не отправлено , поэтому оно никогда не попадает в очередь сообщений.Если это заканчивается в WndProc, и оно не проходит через насос сообщений, какое еще может быть объяснение?

Дескрипторы окна уничтожаются при вызове DestroyWindow, который, в свою очередь, отправляетWM_DESTROY сообщение непосредственно на WndProc.

Я думаю, вам нужно будет найти какой-то другой способ для ваших потенциальных главных окон решить, какой из них является тем, который опускает штору, когда она разрушается.

1 голос
/ 20 февраля 2011

Я нашел метод, который, кажется, делает то, что я хочу.Валик http://www.autoitscript.com/forum/topic/66508-peekmessage-and-wm-close/ вдохновил меня на исследование подклассов.

Сначала я заменяю процедуру Window окна, которую я хочу, специальной процедурой "PostQuitMessage".

Original_WindowProc = (WNDPROC)GetWindowLongPtr(hWnd, GWL_WNDPROC);
SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)&WindowProc);

Процедура окна выглядит следующим образом:

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg,  WPARAM wParam,  LPARAM lParam)
{
    if(uMsg == WM_DESTROY)
    {
        PostQuitMessage(0);
    }

    return CallWindowProc(Original_WindowProc, hWnd, uMsg, wParam, lParam);
}

Это позволяет мне преобразовать любой класс окна (включая системные) в главное окно для моего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...