PDA

Visualizza la versione completa : [VB] Inetercettare la chiusura di un'applicazione


riky78
25-06-2002, 17:56
Ciao a tutti, ho creato un eseguibile in vb che può essere chiuso (in modo molto brutale) da un'altra applicazione tramite TerminateProcess.
Qualcuno sa se è possibile intercettare la chiusura all'interno dell'eseguibile che viene chiuso? Io pensavo che si potesse fare all'interno di Form_Terminate(), ma sembra che non funzioni....

ladyBlu
25-06-2002, 18:01
mi rivendo un suggerimento di Berello.

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

Dim msg 'Dichiara la variabile.
If UnloadMode > 0 Then
'Se si esce dall'applicazione.
msg = "Uscire dall'applicazione?"
Else
'Se si chiude il form.
msg = "Chiudere il form?"
End If

' Interrompe QueryUnload se viene scelto No.
If MsgBox(msg, vbQuestion + vbYesNo, Me.Caption) = vbNo Then Cancel = True

End Sub

oppure anche solo:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

Dim msg 'Dichiara la variabile.

msg = "Uscire dall'applicazione?"
' Interrompe QueryUnload se viene scelto No.
If MsgBox(msg, vbQuestion + vbYesNo, Me.Caption) = vbNo Then Cancel = True Else End

End Sub

con questo codice intercetti sicuramente la combinazione Alt+F4 e la chiusura dal bottone "X" del form.
Volevi questo?

darkblOOd
25-06-2002, 18:02
Originariamente inviato da riky78
Ciao a tutti, ho creato un eseguibile in vb che può essere chiuso (in modo molto brutale) da un'altra applicazione tramite TerminateProcess.
Qualcuno sa se è possibile intercettare la chiusura all'interno dell'eseguibile che viene chiuso? Io pensavo che si potesse fare all'interno di Form_Terminate(), ma sembra che non funzioni....

l'evento Query_Unload scatta prima dell'evento Terminate e tralaltro ti permette di annullare il processo impostando CANCEL=TRUE

riky78
25-06-2002, 18:06
no, il problema è che la chiusura del processo viene fatta da un'altra applicazione tramite TerminateProcess e sembra che questo non generi nessun evento sull'applicazione chiusa....

darkblOOd
25-06-2002, 18:43
già, allora penso che dovresti monitorare i processi attivi, tirarti fuori il process ID della tua applicazione e verificare quando viene terminato

:rolleyes:

penso

riky78
25-06-2002, 18:46
quello non è un problema visto che sono io, con un'altra applicazione a terminarla, il problema è che lei prima di essere terminata non può fare niente... io vorrei che lei prima di chiudersi scriva in un file qualcosa tipo "OHHH, mi hanno chiso!!"...

vonkranz
25-06-2002, 20:54
Preso pari/pari dall'help di VB



Evento QueryUnload


Viene generato prima che un form o un'applicazione vengano chiusi. Quando un oggetto MDIForm viene chiuso, viene generato un evento QueryUnload prima per ilform MDI e quindi per tutti iMDI secondari. Se l'evento non viene annullato in uno dei form, viene generato un evento Unload prima in tutti i form e quindi in un form MDI. Quando un form secondario o un oggetto Form viene chiuso, l'evento QueryUnload viene generato prima dell'evento Unload del form.

Sintassi

Private Sub Form_QueryUnload(cancel As Integer, unloadmode As Integer)

Private Sub MDIForm_QueryUnload(cancel As Integer, unloadmode As Integer)

La sintassi dell'evento QueryUnload è composta dalle seguenti parti:

Parte Descrizione
cancel Intero. Se il valore è diverso da 0, l'evento QueryUnload viene interrotto in tutti i form caricati, impedendo che il form o l'applicazione vengano chiusi.
unloadmode Valore o costante che indica la causa che ha generato l'evento QueryUnload, come indicato nella sezione "Valori restituiti".


Valori restituiti

L'argomento unloadmode restituisce i seguenti valori:

vbFormControlMenu =0 È stato scelto il comando Chiudi dal menu di controllo del form.
vbFormCode =1 L'istruzione Unload viene richiamata dal codice.
vbAppWindows =2 La sessione corrente dell'ambiente operativo Microsoft Windows è conclusa.
vbAppTaskManager =3 L'applicazione è stata chiusa tramite Task Manager di Microsoft Windows.

vbFormMDIForm =4 Il form secondario MDI viene chiuso in quanto viene chiuso il form MDI principale.
vbFormOwner =5 Il form viene chiuso in quanto viene chiuso il proprietario.


Queste costanti sono elencate nellalibreria degli oggetti di Visual Basic (VB) nelVisualizzatore oggetti.

Osservazioni

Questo evento viene in genere utilizzato per verificare che non vi siano operazioni non completate nei form prima che un'applicazione venga chiusa. Se, ad esempio, i dati di un form non sono stati salvati, verrà visualizzato un messaggio in cui si chiede di salvare i dati.

Quando un'applicazione viene chiusa, è possibile utilizzare la routine dell'evento QueryUnload o Unload per impostare la proprietà Cancel su True e interrompere quindi il processo di chiusura dell'applicazione. Mentre l'evento QueryUnload viene generato in tutti i form prima che uno di essi venga scaricato, l'evento Unload viene generato ogni volta che un form viene scaricato.


Penso cmq che tu debba intercettare questo evento in tutti i form della tua applicazione ammesso e non concesso che tu non sappia a priori qual e' il form attivo al momento della chiusura

riky78
25-06-2002, 21:51
Ho provato anche con quello ma non fuziona... l'evento non viene generato oppure non viene intercettato.
Forse TerminateProcess chiude l'applicazione così brutalmente che non gli consente di fare niente, ma mi sembra strano...

Wild78
26-06-2002, 15:36
Se fai una ricerca nel forum, per utente ANS, troverai un interessante intervento sul subclassing, utile in questo caso...



BYE.

riky78
26-06-2002, 16:14
grazie, ora cerco:ciauz:

Loading