WinApi przechwycenie kończenia programu

0
switch(msg)
 {
  case WM_CLOSE:
	  INT a;
    a = MessageBox(NULL, "...", "...", MB_ICONEXCLAMATION);
	if(a == 1)  return DefWindowProc(hwnd, msg, wParam, lParam);
	break;
  case WM_DESTROY:
	  INT b;
    b = MessageBox(NULL, "...", "...", MB_ICONEXCLAMATION);
	if(b == 1)  return DefWindowProc(hwnd, msg, wParam, lParam);
  break;
  default:
   return DefWindowProc(hwnd, msg, wParam, lParam);

Mam takie pytanie. Przy powyrzszym kodzie komunikat się wyświetla przy próbie zamknięcia, natomiast program od razu kończy pracę. Jak zrobić, aby zamknięcie programu nie było możliwe?

0

WM_DESTROY jest wysyłany jak okno zostanie już usunięte z ekranu. Jest to komunikat w odpowiedzi na WM_CLOSE.

Że tak powiem sam się wkopałeś i okno się zamknie. Przecież domyślna procedura okna na widok przetworzonego komunikatu WM_CLOSE wywoła funkcję DestroyWindow(). ;)

Możesz dać tam na przykład return 0 i po sprawie. A cały kod w obsłudze WM_DESTROY jest zbędny.

0
#define CS_DROPSHADOW 0x00020000
#include <windows.h>

LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

 WNDCLASSEX wc;

 wc.cbSize = sizeof(WNDCLASSEX);
 wc.style = CS_DROPSHADOW | CS_NOCLOSE;
 wc.lpfnWndProc = WndProc;
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hInstance = hInstance;
 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH)(COLOR_BTNSHADOW);
 wc.lpszMenuName = NULL;
 wc.lpszClassName = NazwaKlasy;
 wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

 if(!RegisterClassEx(&wc))
 {
  MessageBox(NULL, "Nie można było utworzyć klasy okna", "BŁĄD", MB_ICONEXCLAMATION | MB_OK);
   return 1;
 }


HWND hwnd;

 hwnd = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_TOPMOST, NazwaKlasy, "Oto okienko", WS_SYSMENU, 400, 150, 400, 300, NULL, NULL, hInstance, NULL);

 if(hwnd==NULL)
 {
  MessageBox(NULL, "BŁĄD OKNA", "BŁĄD", MB_ICONEXCLAMATION);
  return 1;
 }

 ShowWindow(hwnd, nCmdShow); //Pokaż okienko...
 UpdateWindow(hwnd);

 
//Pętla komunikatów
 while(GetMessage(&Komunikat, NULL, 0, 0))
 {
  TranslateMessage(&Komunikat);
  DispatchMessage(&Komunikat);
 }
 return Komunikat.wParam;
}

//OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch(msg)
 {
  case WM_CLOSE:
	  INT a;
    a = MessageBox(NULL , "Jeszcze czego!", "Chciałbyś :P", MB_OK | MB_ICONSTOP | MB_SYSTEMMODAL);
	if(a == 1)  return 0;
	break;
  default:
   return DefWindowProc(hwnd, msg, wParam, lParam);
  }
 return 0;
}

Jak kończę zadanie, to komunikat się wyświetla, ale po zamknięciu po ok. 5 sekundach wyskakuje okienko program nie odpowiada i prosi o zamknięcie. Jak oczywiście nacisnę anuluj to program dalej działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1