Retracé le handle d'une app a son lancement.

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 683 fois - Téléchargée 29 fois

Contenu du snippet

Salut, j'ai cherché (et cherché) beaucoup pour se code
Il permet d'avoir le handle d'une application que vous lancé

Merci de me laissé vos commentaires et vos suggestions

Source / Exemple :


Public Declare Function NextWindow Lib "user32" Alias "GetWindow" (ByVal hWND As Long, ByVal wCmd As Long) As Long
Public Declare Function TxtWindow Lib "user32" Alias "GetWindowTextA" (ByVal hWND As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function idPapa Lib "user32" Alias "GetParent" (ByVal hWND As Long) As Long
Public Declare Function MoveWindow Lib "user32" (ByVal hWND As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Public Declare Function SetPapa Lib "user32" Alias "SetParent" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

Private Type APPBLOCK
 hWND(1 To 1024) As Long
 Count As Integer
End Type

Public Function csProcessList() As APPBLOCK
Dim OAPP As APPBLOCK
    Dim hWND As Long
    Dim TitreFenetre As String * 255
    Dim Titre As String
    Dim papa, i As Integer
    i = 1
    hWND = NextWindow(RecupHandleBureau(), 5)
    Do While hWND <> 0
        TitreFenetre = String(255, 0)
        R = TxtWindow(hWND, TitreFenetre, 255)
        papa = idPapa(hWND)
        If TitreFenetre <> String(255, 0) Then
            Titre = TitreFenetre
            Titre = Left(Titre, R)
            OAPP.hWND(i) = hWND
            i = i + 1
        End If
        hWND = NextWindow(hWND, 2)
    Loop
    OAPP.Count = i - 1
    csProcessList = OAPP
End Function

Public Function GetLastHwnd(OAPP As APPBLOCK) As Long
Dim i As Integer, temp As APPBLOCK
temp = OAPP
DoEvents
OAPP = csProcessList
DoEvents
i = 1
While i < OAPP.Count + 1
 If HwndExist(OAPP.hWND(i), temp) = True Then
 Else
  GetLastHwnd = OAPP.hWND(i)
  Exit Function
 End If
 i = i + 1
Wend
 GetLastHwnd = -1
End Function

Public Function HwndExist(sHwnd As Long, OldData As APPBLOCK) As Boolean
Dim i As Integer
i = 1
While i < OldData.Count + 1
 If OldData.hWND(i) = sHwnd Then: HwndExist = True
 i = i + 1
Wend
HwndExist = False
End Function

Public Function CygCRun(Program As String) As Long
 Dim fa As APPBLOCK
 fa = csProcessList()
 DoEvents
 On Error GoTo ReportError
 Shell Program, vbNormalFocus
 DoEvents
 CygCRun = GetLastHwnd(fa)
 Exit Function
ReportError:
 CygCRun = -1
End Function

Conclusion :


Pour utiliser le code:
Mettez tout le code dans un module
ensuite vous le lancer comme suit

dim a as long
a=CygCRun("C:\Windows\Notepad.exe")

a contiendra le # d'handle de notepad.exe ( a moin q'une autre application soit lancé au meme moment )

je sais pas trop quel niveau est cette source, donc je la mets niv.2

Encore une foix laissé vos commentaires et vos suggestions, svp.

A voir également

Ajouter un commentaire Commentaires
Messages postés
205
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
13 novembre 2009

tss... fonctionne pas le code de OphidiaN
Tout ske sa fait cé faire planté mon vb
Nice dude!
Messages postés
205
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
13 novembre 2009

Merci OphidiaN, j'ai jamais été sur allapi.net je vais aller voir sa a peut etre interessant
Messages postés
235
Date d'inscription
mercredi 4 avril 2001
Statut
Membre
Dernière intervention
9 novembre 2007

Ah oui ya meme une erreur sur allapi.net, ils disent que ShellExecute renvoi le handle de l'application lancée et c faux evidemment... il renvoi 42, et ce uniquement si ya pas eu d'erreurs....

Pour en revenir au prob, en relisant ton code, tu fais quasi la meme technique, sauf que toi c un peu à l'arrache que tu fais ta boucle.... ya tout et nimporte koi ki est filtré....
Messages postés
235
Date d'inscription
mercredi 4 avril 2001
Statut
Membre
Dernière intervention
9 novembre 2007

en fait t'as pas du chercher autant ke tu le dis lol :)
allapi.net, 3 min de recherche, on peut en modeler ça:

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 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


Function InstanceToWnd(ByVal target_pid As Long) As Long
Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
test_hwnd = FindWindow(ByVal 0&, ByVal 0&)
Do While test_hwnd <> 0
If GetParent(test_hwnd) = 0 Then
test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
If test_pid = target_pid Then
InstanceToWnd = test_hwnd
Exit Do
End If
End If
test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
Loop
End Function


ensuite le reste est tout con:

Dim Pid as long
Pid = Shell("c:\windows\notepad.exe", vbNormalFocus)
if Pid = 0 Then MsgBox "Erreur dans le lancement"
TonhWnd = InstanceToWnd(Pid)

bon j'admet t'as qd meme bien bossé si tu l'as fait tout seul....
@++
www.fbsl.net
Messages postés
205
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
13 novembre 2009

Alain Proviste Possible, j'ai cherchéici pour la fonction csProcessList
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.