2013-08-09 10 views
9

Obsługuję klucz ESC w mojej aplikacji i po otrzymaniu tego klucza chcę zamknąć bieżące okno.W win32 C++ programowanie, aby zamknąć okno, czy powinienem sam wywołać DestroyWindow (hWnd) lub SendMessage (WM_CLOSE, hWnd, 0, 0)?

Czy powinienem po prostu zadzwonić pod numer DestroyWindow(hWnd) lub powinienem SendMessage(WM_CLOSE, hWnd, 0, 0), czy powinienem zamknąć bieżące okno w inny sposób?

+0

Jeśli wszystkie funkcje obsługi 'WM_CLOSE' nazywają się' DestroyWindow() ', nie ma powodu, aby po prostu wywoływać to bezpośrednio. Zależy, czy chcesz wykonać inne przetwarzanie (np. Wyświetlić okno dialogowe "Czy na pewno chcesz zakończyć?"). –

+0

Dzięki Jonathan. Nie wykonuję żadnego innego przetwarzania, mój program 'WM_CLOSE' po prostu wywołuje' DestroyWindow() '. – bodacydo

Odpowiedz

16

Powinieneś PostMessage(hWnd, WM_CLOSE, 0, 0). Nakłada komunikat WM_CLOSE do kolejki komunikatów okna w celu przetworzenia, a okno może zamknąć się poprawnie, gdy kolejka wiadomości zostanie wyczyszczona.

Powinieneś użyć PostMessage zamiast SendMessage. Różnica polega na tym, że PostMessage po prostu umieszcza komunikat w kolejce komunikatów i zwraca; SendMessage czeka na odpowiedź z okna i nie trzeba tego robić w przypadku WM_CLOSE.

0

Albo PostMessage lub SendMessage WM_CLOSE

+0

Dzięki Paul, próbuję tego. PS. Jaka jest różnica między PostMessage i SendMessage? – bodacydo

+0

Dawno nie robiłem Win32 - z pamięci, SendMessage wysyła wiadomość synchronicznie, natomiast PostMessage działa asynchronicznie, umieszczając komunikat w kolejce do normalnego przetwarzania wiadomości. –

+0

-1 Podczas gdy sugerujesz, że 'PostMessage' jest tak dobry jak' SendMessage', 'SendMessage' jest z pewnością niewłaściwym narzędziem. – IInspectable

2

To zależy od Ciebie, którego używasz. Czy klawisz Esc działa tak, jak kliknięcie przycisku zamykania, czy powinien zdecydowanie zniszczyć okno?

Domyślna implementacja WM_CLOSE (jak stwierdzono w DefWindowProc) wywołuje DestroyWindow, więc jeśli nie jesteś obsługi WM_CLOSE specjalnie następnie jeden jest tak dobry jak drugi. Ale WM_CLOSE nie musi koniecznie wywoływać DestroyWindow, więc jeśli okno to obsługuje to może zrobić coś innego. Na przykład it could pop up a "Are you sure?"-type message box lub po prostu nic nie rób. DestroyWindow ominie to wszystko.

1

Powinieneś użyć PostQuitMessage.

Od MSDN: użyciu funkcji korzystania postMessagePostQuitMessage Nie opublikować WM_QUIT wiadomość.

Jeśli używasz PostMessage, ryzykujesz wysłanie tego komunikatu do wszystkich okien najwyższego poziomu, jeśli wartość hWnd w jakiś sposób stanie się HWND_BROADCAST.

Powiązane problemy