Mauvaise Nouvelle... pour ceux qui veulent incorporer ("encapsuler") u

Signaler
Messages postés
321
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
14 mai 2005
-
Messages postés
908
Date d'inscription
jeudi 26 juillet 2001
Statut
Modérateur
Dernière intervention
1 février 2015
-
C'est le but que je m'étais fixer...

1) Je lance mon programme VB

2) Je lance un exécutable (prenons l'exemple de NotePad) à partir de mon programme VB (avec la méthode Shell)

3) Je veux que la fenêtre de cet exécutable soit encapsuler (fenetre fille) dans la fenetre de mon programme VB (fenetre parent)...

Voilà le bout de code que j'ai essayé et hélas il ne marche pas... La méthode API SetParent ne marche qu'avec les Objet INTERNE à VB... C'est à dire qu'elle ne reconnait pas les fenêtres externes aux programmes VB (Ce qui est relativement étrange sachant que c'est une API --> + de puissance avec un travail au coeur de l'OS, par dessus la couche VB)...

Dim idHwndChild As Long

idHwndChild = Shell("c:\windows\NotePad.exe")
SetParent idHwndChild, Me.hwnd

Et ce code ne marche pas...
Meme si je place la dernière ligne dans un évènement bouton, ça change rien...

Pour ceux qui veulent essayer bon courage et surtout merci pour la solidarité, mais là, je ne vois vraiment pas comment faire... je me demnade si c'est faisable (avec une fenetre fille EXTERNE à VB)

Jockos

7 réponses

Messages postés
81
Date d'inscription
lundi 18 février 2002
Statut
Membre
Dernière intervention
29 août 2003

a mon avis le problème c'est que ton Shell("c:\windows\NotePad.exe") ne renvoie pas un hwnd d'une fenetre MDIChild mais un hwnd d'une fenetre classique donc tu ne peux pas lui spécifier un parent.

Essaie de changer le type de fenetre...
Hélas je ne sais pas comment faire %-6
0
Messages postés
321
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
14 mai 2005
2
A mon avis tu dois pas être loin de la vérité... mais c'est bizarre que l'API SetParent ne fasse pas le lien entre les fenetres VB et les fenêtres Windows (exterieur à VB, comme le NotePad par exemple)...

Si il n'arrive pas à faire le lien entre les Hwnd des fenêtres Internes à VB de celle externes, c'est que la méthode API SetParent ne peut le faire...
Ou comme tu dis, parce que la méthode Shell ne renvoie pas un Hwnd "compréhensible" pour la méthode API setParent...

Enfin, c'est chaud comme problème et pourtant, c'est tout simple en terme de compréhension... mais techniquement, je suis bloqué...
0
Messages postés
81
Date d'inscription
lundi 18 février 2002
Statut
Membre
Dernière intervention
29 août 2003

j'ai trouvé ton problème, c'est que shell renvoie un Id de fenetre au lieu du Hwnd de la fenetre.
Il te faut donc retrouver le hwnd de la fenetre Notepad.
J'ai essayé le code suivant et cela fonctionne nickel...

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 Sub menu1_Click()
Dim idHwndChild As Long
Dim Pid As Long
Pid = Shell("c:\winnt\NotePad.exe")
idHwndChild = InstanceToWnd(Pid)
SetParent idHwndChild, Me.hwnd
End Sub

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
0
Messages postés
321
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
14 mai 2005
2
Je vais essayer ça tout de suite...
Merci beaucoup de ton aide et de ton temps, c'est super cool...

A+
0
Messages postés
321
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
14 mai 2005
2
Y a une faute dans le code au niveau du "Do While"
Peux-tu me donner l'URL du site ou tu as choppé ce bout de code...

Merci d'avance...

A+
0
Messages postés
81
Date d'inscription
lundi 18 février 2002
Statut
Membre
Dernière intervention
29 août 2003

Do While test_hwnd <> 0
0
Messages postés
908
Date d'inscription
jeudi 26 juillet 2001
Statut
Modérateur
Dernière intervention
1 février 2015
2
Vous avez peut-être déjà la solution grâce Troopers, mais voici un code source écrit par moi ( si qui implik que je peux expliquer en cas d'incomprehension chronik )

Option manger le process...

http://www.vbfrance.com/article.aspx?Val=4741
0