winapi - Hvordan kan jeg registrere vinduesødelæggelse fra hovedtråden?

Indlæg af Hanne Mølgaard Plasc

Problem



Typisk vil vinduet proceduren for en 'main' vinduesklasse kalde PostQuitMessage som svar på en WM\_DESTROY meddelelse.


Jeg foretrækker at have hovedtråden afgøre, hvornår den vil opsige baseret på levetiden for det eller de vinduer, det skaber. På denne måde kan uanset hvilken vinduesklasse jeg vælger at være hovedvinduet have en generisk vindueprocedure, der ikke har PostQuitMessage i den.


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

    if(msg.hwnd == hWnd && msg.message == WM\_DESTROY)
    {
        PostQuitMessage(0);
    }
}


Ovenstående er mit forsøg, men meddelelsen WM\_DESTROY er aldrig sendt til meddelelseskøen, det ser ud til at være internt for vinduet.


Er der nogen måde at opnå dette på?

Bedste reference


WM\_DESTROY bliver sendt snarere end indsendt , hvorfor den aldrig lander i meddelelseskøen. Hvis det ender i WndProc, og det kommer ikke gennem beskedpumpen, hvilken anden forklaring kunne der være?


Vinduesgreb ødelægges ved at kalde DestroyWindow, som igen sender WM\_DESTROY beskeden direkte til WndProc.


Jeg tror, ​​at du bliver nødt til at finde en anden måde for dine potentielle hovedvinduer at bestemme, hvilken er den, der bringer gardinet ned, når det ødelægges.

Andre referencer 1


Jeg har fundet en metode, der synes at gøre, hvad jeg vil have. Jeg blev inspireret af http://www.autoitscript.com/forum/topic/66508-peekmessage-and-wm-close/af Valik for at undersøge underklasse. [9]


Først erstatter jeg vinduesproceduren i vinduet, som jeg vil have en særlig 'PostQuitMessage' -procedure.


Original\_WindowProc = (WNDPROC)GetWindowLongPtr(hWnd, GWL\_WNDPROC);
SetWindowLongPtr(hWnd, GWLP\_WNDPROC, (LONG\_PTR)&WindowProc);


Vinduet procedure ser sådan ud:


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


Dette giver mig mulighed for at konvertere enhver vinduesklasse (herunder system-enheder) til hovedvinduet til min ansøgning.