Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long Declare Function GetExitCodeProcess Lib "kernel32" _ (ByVal hprocess As Long, lpExitCode As Long) As Long Declare Function CloseHandle Lib "kernel32" _ (ByVal hObject As Long) As Long Const STILL_ACTIVE = &H103 Const PROCESS_QUERY_INFORMATION = &H400 Function RikShell(exe As String, Optional WinStyle) As Integer Dim processid As Long Dim hprocess As Long Dim exitcode As Long Dim parm As Integer 'Controllo il parametro opzionale finestra Select Case VarType(WinStyle) Case vbEmpty, vbNull, vbError parm = vbNormalFocus Case vbLong, vbInteger, vbSingle, vbDouble parm = WinStyle Case Else parm = vbNormalFocus End Select 'Prelevo l'ID del processo lanciato processid = Shell(exe, parm) 'Creo un Handle per quel processo hprocess = OpenProcess(PROCESS_QUERY_INFORMATION, False, processid) Do 'Controllo ripetutamente che termini Call GetExitCodeProcess(hprocess, exitcode) 'Lascio libero il sistema di processare le altre 'applicazioni DoEvents Loop While (exitcode = STILL_ACTIVE) CloseHandle (hprocess) End Function Esempio di uso da un pulsante sopra un Form Option Explicit Private Sub cmdLancio_Click() RikShell "notepad.exe" End Sub 'Ora che hai una funzione che permette di lanciare in maniera 'sincrona un'applicazione esterna alla tua, puoi renderla anche 'modale in questo modo: 'Crei un form e lo ridimensioni a zero (basta prendere l'angolo 'in basso a destra e portarlo in alto a sinistra. 'Resta cosi` solo la barra del titolo. Imposti Border=None. 'In questa maniera il form e` invisibile. '(o piu` semplicemente metti un hide nell'evento Load, anche se 'per qualche millisecondo si vede il form) 'In questo form (chiamiamolo FModal) metti nell'evento Activate 'RikShell <ProgDaLanciare> Unload me 'In questo modo mentre e` in esecuzione il programma esterno 'desiderato, non e` possibile cliccare niente sul form 'principale. Questa soluzione dovrebbe andare bene, anche se e` un po' laboriosa (ma non troppo). Innanzi tutto bisogna utilizzare una funzione tipo questa: Come funzione Shell, ma il programma VB resta in attesa che il programma lanciato termini. |