Newsgroup: it.comp.lang.visual-basic
Titolo: Visualizzazione EXE in form VB e chiusura processi

Ciao!
Dopo il fine settimana lungo, rimangono alcuni dubbi.
Riassunto delle puntate precedenti (
http://makeashorterlink.com/?D2A854DA9
 ) :
in un form del mio programma VB visualizzo un programma di altro produttore.
1) Su  2 pc Win98 (prima e seconda versione) il programma di terzi non viene
subito visualizzato, ma solo dopo la massimizzazione del mio form; su XP
tutto sembra funzionare correttamente.
2) Forzando da VB (via API) la chiusura di un processo, si rischia di
rendere instabile il sistema? Ci possono essere altri problemi?
Grazissime e a presto!! :)
        Alex

Ciao Alex,
 ho letto del tuo lavoro e volevo sapere come hai fatto ad aprire un exe 
esterno all'interno del tuo programma vb.
Grazie Giuseppe 

 exe esterno all'interno del tuo programma vb.
A volte resto allibito di fronte a post come questi.
Alberto
--
E tutto mi sembrava andasse bene...

Il codice al quale ho attinto e' quello riportato in calce al presente
articolo (e' l'esempio di codice che, in API Guide, e' associato a diverse
API fra quelle dichiarate). In particolare, direi che la funzione SetParent
e' quella importante.
Da quello che capisco (se non dico eresie ;)) ), nell'esempio, l'eseguibile
(in questo caso e' il Blocco Note di Windows) viene lanciato normalmente con
Shell, quindi la funzione InstanceToWnd recupera l'handle della finestra
dell'eseguibile e, attraverso l'API SetParent, il form e' impostato come
parent della finestra del Blocco Note. Ma la mia non e' nient'altro che una
parafrasi in italiano dei commenti inclusi nel codice... ;)
La mia necessita' era quella di visualizzare il programma in questione
all'interno di un mio form anche xche' si trattava di un eseguibile con
un'interfaccia utente praticamente inesistente e xche', una volta lanciato
con una "shell" nuda e cruda, non potevo spostarlo in alcun modo in un'altra
parte dello schermo.
Per ulteriori chiarimenti rimando all'altro 3d:
http://makeashorterlink.com/?D2A854DA9
Ciao!
    Alex
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal
lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long,
ByVal hWndNewParent As Long) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd
As Long, lpdwProcessId As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal
wCmd As Long) As Long
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hwndLock As
Long) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As
Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As
Long, ByVal uExitCode As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function Putfocus Lib "user32" Alias "SetFocus" (ByVal hwnd
As Long) As Long
Const GW_HWNDNEXT = 2
Dim mWnd As Long
Function InstanceToWnd(ByVal target_pid As Long) As Long
    Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
    'Find the first window
    test_hwnd = FindWindow(ByVal 0&, ByVal 0&)
    Do While test_hwnd <> 0
        'Check if the window isn't a child
        If GetParent(test_hwnd) = 0 Then
            'Get the window's thread
            test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
            If test_pid = target_pid Then
                InstanceToWnd = test_hwnd
                Exit Do
            End If
        End If
        'retrieve the next window
        test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
    Loop
End Function
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: 
http://www.allapi.net/
    'E-Mail: KPD...@Allapi.net
    Dim Pid As Long
    'Lock the window update
    LockWindowUpdate GetDesktopWindow
    'Execute notepad.Exe
    Pid = Shell("c:\windows\notepad.exe", vbNormalFocus)
    If Pid = 0 Then MsgBox "Error starting the app"
    'retrieve the handle of the window
    mWnd = InstanceToWnd(Pid)
    'Set the notepad's parent
    SetParent mWnd, Me.hwnd
    'Put the focus on notepad
    Putfocus mWnd
    'Unlock windowupdate
    LockWindowUpdate False
End Sub
Private Sub Form_Unload(Cancel As Integer)
    'Unload notepad
    DestroyWindow mWnd
    'End this program
    TerminateProcess GetCurrentProcess, 0
End Sub

> A volte resto allibito di fronte a post come questi.
...???...
Scusa l'ignoranza abissale, ma non ho capito xche' allibisci...
    Alex


Perchè tu, correttamente e responsabilmente, hai riportato il link che
consente, attraverso due click, di accedere al codice completo per fare ciò
che serve.
Oltretutto, avevi anche riportato il sito da cui avevi attinto il codice
originale, per cui, volendo, si poteva avere anche altro materiale da
studiare.
E poi arriva uno e chiede 'mi spieghi come si fa...?'.
Capisco voler risparmiare due click, ma cavolo...


 E poi arriva uno e chiede 'mi spieghi come si fa...?'.
:D:D:D:D:D:D:D:D:D
Si', be'... tante volte quell'"uno"... sono io... soprattutto in questo ng.
;)))
    Alex

         Alex
Prego
Raf

NO albe se segui il click c'è la discussione dove da gia per scontata a 
parte che ho chiesto io
Ciao Pep 

Emmmh...scusa Albe errore mio...rileggendo il msg ho visto che c'è un link 
nel link con il codice...me l'ero perso...venia :-)))
Pep 

 penso che non ci siano problemi.
In realta', come dicevo, ho sostituito TerminateProcess con CloseProcess
(funzione recuperata dal sito comune che invia WM_QUIT a tutti i threads del
processo) che mi risolve l'altro problema di cui parlavo, cioe' il fatto di
continuare ad avere il processo attivo nel Task Manager.
Ancora grazissime!! :))
    Alex