Newsgroup: it.comp.programmare.win32
Titolo: Chiudere un'app senza GUI II

Salve a tutti,
in questi tre giorni ho fatto un po' di esperimenti per quanto
riguarda l'intercettazione degli eventi di logoff/shutdown, ma non
hanno avuto esito positivo.
All'inizio ho seguito il consiglio di Bruno Rivara (usare
SetConsoleCtrlHandler), ma il mio prog era del tutto insensibile alle
richieste del sistema, tanto che, tentando di chiuderlo con "Termina
applicazione", Finestre 98 mi risponde subito che l'applicazione è
bloccata.
Ho quasi subito tentato l'altra soluzione, quella di Kojak (creare una
finestra invisibile), ma le cose non sono andate molto diversamente.
Stavolta ho il codice:
HANDLE QuitEventHandle;
DWORD WINAPI QuitThread(HINSTANCE * hInst) {
	QuitEventHandle = OpenEvent(EVENT_ALL_ACCESS, TRUE, "La messa
è finita");
	WNDCLASS wc;
	{
		wc.style = 0;
		wc.lpfnWndProc = QuitWndProc;
		wc.cbClsExtra = 0;
		wc.cbWndExtra = 0;
		wc.hInstance = *hInst;
		wc.hIcon = NULL;
		wc.hCursor = NULL;
		wc.hbrBackground = NULL;
		wc.lpszMenuName = NULL;
		wc.lpszClassName = "App";
	}
	RegisterClass(&wc);
	HWND hwnd = CreateWindow("App", "App", WS_OVERLAPPED |
WS_DISABLED, 0, 0, 0, 0, NULL, NULL, *hInst, NULL);
	for(;;) {
		MSG msg;
		if(GetMessage(&msg, hwnd, 0, 0) == FALSE) {
			SetEvent(QuitEventHandle);
			MessageBox(hwnd, "E' arrivato un
WM_QUIT!!!!!", "App", MB_ICONINFORMATION);
			break;
		}
	}
	return 0;
}
LRESULT CALLBACK QuitWndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM
lp) {
	if(msg == WM_QUIT) {
		SetEvent(QuitEventHandle);
		MessageBox(hwnd, "E' arrivato un WM_QUIT!!!!!", "App",
MB_ICONINFORMATION);
	}
	return 0;
};
Nonostante tutto arrivano solo tre messaggi, alla creazione della
finestra: WM_GETMINMAXINFO, WM_NCCREATE e (stranamente) WM_NCDESTROY.
La prova del "Termina applicazione" finisce come prima, convinto che
l'applicazione sia bloccata. E i MessageBox stanno tranquilli.
Che ne pensate??
--
E.G. er Cicca
er_c...@freemail.it
Per rispondere in privato, sostituite @
usa.net
 con @
freemail.it
Hiroshima 45, Chernobyl 86, Windows 98

 bloccata.
Il codice sotto funziona correttamente con Fenster NT (scusa, io lavoro
nella Svizzera tedesca) usando SetConsoleCtrlHandler, non ho un 98 
disponibile al momento.
Nel codice che usa la finestra invisibile, c'e' qualcosina che non 
va:
1. Nel message loop non c'e' TranslateMessage/DispatchMessage quindi la 
   Window Procedure non ricevera' nessun messaggio dalla coda. 
2. WM_QUIT e' mandato in risposta a un PostQuitMessage dalla 
   applicazione stessa. Quindi non riceverai nessun WM_QUIT.
3. Nella Window Procedure non c'e' una chiamata alla default 
   Wnd Proc, e questo puo' essere la causa della applicazione 
   bloccata (messaggi mandati con SendMessage arrivano comunque 
   alla Wnd Proc).
4. Nella Wnd Proc dovresti checkare WM_DESTROY, che sicuramente
   sara' mandato quando l'applicazione e' chiusa in risposta a 
   logoff/shutdown.
Ciao
Bruno
-----------------------------------------------------------------------
BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
{
FILE *hOut=fopen("test.txt", "wb");
switch (dwCtrlType){
    case CTRL_CLOSE_EVENT:
        fprintf(hOut, "CTRL_CLOSE_EVENT\r\n");
        break;
    case CTRL_LOGOFF_EVENT:
        fprintf(hOut, "CTRL_LOGOFF_EVENT\r\n");
        break;
    case CTRL_SHUTDOWN_EVENT:
        fprintf(hOut, "CTRL_SHUTDOWN_EVENT\r\n");
        break;
    case CTRL_C_EVENT:
        fprintf(hOut, "CTRL_C_EVENT\r\n");
        break;
    case CTRL_BREAK_EVENT:
        fprintf(hOut, "CTRL_BREAK_EVENT\r\n");
        break;
    }
fclose(hOut);
return FALSE;
}
int main(int argc, char *argv[])
{
SetConsoleCtrlHandler(HandlerRoutine, TRUE);
for (; ; ) {
    Sleep(500);
    }
return 0;
}