Newsgroup: it.comp.lang.visual-basic
Titolo: Chiudere finestra

Ciao,
spero di non essere OT nel caso avvertitemi...
sto lavorando con Visual Basic 2008 Express Edition.
ho creato un pulsante col quale apro una finestra :
Call Shell("Explorer.exe C:\Test\", AppWinStyle.NormalFocus)
questo funziona; ora, in un altro pulsante vorrei chiudere
C:\Test ma come posso fare?
grazie
Marco


Quello che stai facendo non è "aprire una finestra"... il codice che
hai postato si legge: "lancio una applicazione esterna (explorer.exe)
in maniera asincrona, passando un parametro a riga di comando che,
incidentalmente, fa si che tale programma esterno apra una finestra
della GUI di windows"
Questo lo dico non per fare lo sborone, ma per farti capire che in
realtà la tua domanda presuppone qualcosa di ben diverso dal semplice
"chiudere una finestra aperta" e non è affatto banale.
Siccome non hai alcun controllo su questa finestra aperta, visto che
non è roba tua, devi essere in grado di riacchiappare un riferimento,
in modo da poterla in qualche modo pilotare... in linea di massima,
puoi farlo tramite API, con qualcosa del genere:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
As Long
Const WM_CLOSE = &H10
Dim hWindow As Long
Dim result As Long
hWindow = FindWindow(vbNullString, "Titolo della tua finestra")
If winHwnd <> 0 Then
    PostMessage hWindow, WM_CLOSE, 0&, 0&
Else
    MsgBox "Finestra non trovata"
End If
La cosa però si complica perchè parliamo di una normale finestra di
explorer, e il titolo non è garanzia di univocità... sul mio PC per
esempio sarebbe "Test", ma su un'altra macchina uno potrebbe attivare
l'opzione "Visualizza percorso completo sulla barra del titolo" e nel
caso sarebbe invece "C:\Test"
Un'alternativa sarebbe usare FindWindowEx, ma anche qui il nome di
classe (invece del titolo finestra) è troppo generico, e rischieresti
di chiudere la finestra sbagliata
Probabilmente bisognerebbe usare una combinazione delle due cose per
avere un risultato affidabile, ma a questo punto mi chiedo se non è
molto meglio far vedere il contenuto di quella cartella in maniera
migliore, che non usare explorer in quel modo.

 End If
Chiedo venia, ho postato il codice con sintassi VB6 invece che
VB.NET... la sostanza è lo stessa comunque

 ha scritto nel messaggio 
news:36340457-f1d4-4d9d...@j19g2000yqk.googlegroups.com...

Marco,
con VB.Net non ti conviene usare Shell se non per aprire processi sincroni o 
dei quali non vuoi mantenere il controllo.
Se capisco cosa vuoi fare, forse � meglio se usi la classe Process. Es.:
(tralascio volutamente qualsiasi controllo dell'errore)
Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button11.Click
Static prcid As Integer
Static proc As Diagnostics.Process
'se premi due volte il pulsante chiudi il processo avviato pi� avanti
If prcid <> 0 Then
    prcid = 0
    proc.CloseMainWindow()
    proc.Close()
    Exit Sub
End If
'esecuzione asincrona del processo
proc = Diagnostics.Process.Start("C:\WINDOWS\NOTEPAD.EXE")
prcid = proc.Id
Dim excd As Integer = -1
'attendi che il processo venga chiuso: ci sono altri modi pi� eleganti per 
farlo ma non so cosa ti serve
Do
    Application.DoEvents()
    If prcid = 0 Then Exit Do
    If proc.HasExited Then
        excd = proc.ExitCode
        prcid = 0
    End If
Loop
End Sub
In questo modo (proc.ExitCode) puoi anche verificare se l'applicazione � 
stata chiusa dall'esterno e qual � il suo codice di ritorno.
Ciao,
Stefano

 Stefano
Ciao,
sto provando il tuo codice ma non mi ci trovo...
innanzitutto mi da un errore in  >>> prcid = proc.Id <<<
poi se clicco il pulsante si apre la mia finestra ma non riesco
a chiuderla...

a chiuderla...
Ciao Marco,
l'errore sulla riga "prcid = proc.Id" � possibile solo se l'applicaione � 
stata chiusa (non esiste pi� un processo associato a 'proc'), quindi se 
l'applicazione si � chiusa immediatamente o se hai usato 'proc.Close'. Se mi 
dici qual � esattamente l'errore forse posso capire meglio.
Il mio esempio va preso alla lettera: se crei un pulsante in una finestra e 
incolli il codice, dovrebbe funzionare. La logica � questa:
1. le variabili prcid e proc sono Static: questo significa che ogni volta 
che accedi alla funzione trovi gli stessi valori
2. al primo accesso prcid=0 quindi passa oltre e lancia notepad.exe
3. resta nel loop in attesa che si verifichi una delle seguenti condizioni:
- prcid diventa zero (vedi punto 4)
- proc.HasExited = True (quando l'applicazione viene chiusa)
4. se fai nuovamente click sul pulsante entri mentre � in esecuzione il loop 
e prcid<>0, quindi entri nella prima condizione che esegue la chiusura 
dell'applicazione notepad e assegna a prcid il valore zero, consentendo cos� 
al loop di uscire.
Stefano