Il fatto è che non devi usare la Shell ma la classe Process con tutte le sue caratteristiche.
http://msdn.microsoft.com/it-it/libr...v=vs.110).aspx
No MP tecnici (non rispondo nemmeno!), usa il forum.
Ti ringrazio! Mi sei stato di grande aiuto. Ma ho ancora un piccolo problema.
Anzitutto:
1) Ho creato un Form contenente un TextBox (che contiene il path del programma WordPad.EXE) e un Button. Il codice è banale e funziona perfettamente:
----------------------------------
Imports System
Imports System.Diagnostics
Imports System.ComponentModel
Public Class Form1
Public Aperto As Boolean
Public X As Process
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Programma As New Process()
If Aperto = True Then
X.Kill()
End If
Programma.StartInfo.UseShellExecute = False
Programma.StartInfo.FileName = TextBox1.Text
Programma.StartInfo.CreateNoWindow = False
Programma.Start()
X = Programma
Aperto = True
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Aperto = False
End Sub
End Class
--------------------------
Grazie a If ... End If Ogni volta che premo Button1 viene chiusa la sessione (eventualmente già aperta) di WordPad e ne viene creata una nuova (poco male: avrei preferito aprire un file all'interno di quella già aperta, ma mi accontento...).
2) Il fatto è che se l'utente, dopo aver aperto WordPad premendo Button1, chiude la finestra di WordPad e poi preme Button1, il programma si interrompe perché, giustamente, non "vede" più il processo WordPad da "Killare".
Bisognerebbe inserire del codice come questo:
If finestra WordPad = aperta Then X.Kill Else Continua così.
Un suggerimento? Grazie in anticipo!
Infatti potresti scrivere semplicemente
codice:Dim programma As Process = Nothing Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If programma Is Nothing Then programma = New Process() Else If Not programma.HasExited Then programma.Kill() End If End If programma.StartInfo.UseShellExecute = False programma.StartInfo.FileName = TextBox1.Text programma.StartInfo.CreateNoWindow = False programma.Start() End Sub
No MP tecnici (non rispondo nemmeno!), usa il forum.
Grazie anche a te, era proprio quello che mi serviva!
Ora WordPad (se aperto) viene chiuso e subito dopo se ne apre una nuova sessione.
A chi può interessare, ecco la modifica da apportare alla sub del post precedente:
----------------------------------------
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Programma As New Process()
If Aperto = True ThenIf X.HasExited = False ThenX.Kill() : Aperto = FalseEnd IfEnd If
If Aperto = False ThenProgramma.StartInfo.UseShellExecute = FalseEnd If
Programma.StartInfo.FileName = TextBox1.Text REM & " " & TextBox2.Text REM IMPOSSIBILE TROVARE IL FILE SPECIFICATO
Programma.StartInfo.CreateNoWindow = False
Programma.Start()
X = Programma
Aperto = True
End Sub
--------------------------------------
Tuttavia c'è da dire che WordPad è un programma leggerissimo e il tempo necessario a chiudere e riaprire una sua sessione è praticamente inavvertibile. Ma se, invece di WordPad, voglio aprire programmi più corposi (come PhotoShop), il tempo di apertura / chiusura potrebbe risultare eccessivo. C'è un modo per "costringere" Visual Basic a usare sempre la stessa sessione del programma con cui aprire i vari file di competenza?
Tra l'altro (si noti la parte del codice compresa tra i due REM) VisualBasic segnala l'inesistenza del file se tento di aprire WordPad facendo seguire il Path del file di testo RTF (ovviamente presente in TextBox2.Text). Con quale sintassi è possibile aprire un file "associato" a Programma.StartInfo.FileName ? Ho provato facendo precedere il nome del Path del file RTF da un semplice spazio (come nel codice riportato qui sopra, togliendo il REM ) da una virgola, da una barra dritta o inversa, ma il file sembra sempre non esistere (non ho commesso errore di digitazione: ho trascritto con copia/incolla).