OpenModal




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.










( openmodal.html )- by Paolo Puglisi - Modifica del 17/12/2023