récupérer le nom de l'exe à partir du handle de la fen

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

bon, mon usine à gaz qui marche

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Pour récupérer le handle de la fenêtre de l'exécutable lancé

NewList Liste_Fenetres()
Structure PROCESSENTRY32
  dwSize.l
  cntUsage.l
  th32ProcessID.l
  *th32DefaultHeapID.l
  th32ModuleID.l
  cntThreads.l
  th32ParentProcessID.l
  pcPriClassBase.l
  dwFlags.l
  szExeFile.b [260]
EndStructure
Procedure.l RunProgramEx(NomFichier$, Parametre$, RepertoireCourant$)
  Protected WindowID.l, hWnd.l, LastWindowID.l, pid.l, Process32Search.l
  ClearList(Liste_Fenetres())
  
  ; Fenêtre au premier plan
  WindowID = GetForegroundWindow_()
  
  ; On liste les fenêtres ouvertes
  hWnd.l = FindWindow_(0, 0)
  While hWnd <> 0
    If GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE
      AddElement(Liste_Fenetres())
      Liste_Fenetres() = hWnd
    EndIf
    hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
  Wend
  
  ; On lance le programme
  RunProgram(NomFichier$, Parametre$, RepertoireCourant$)
  
  NomFichier$ = LCase(GetFilePart(NomFichier$))
  
  ; On cherche l'ID du la fenêtre créée
  Repeat
    Delay(50)
    
    LastWindowID = GetForegroundWindow_()
    
    If LastWindowID <> 0 And LastWindowID <> WindowID
      ; On compare avec la liste des fenêtres qui étaient ouvertes
      ResetList(Liste_Fenetres())
      While NextElement(Liste_Fenetres())
        If LastWindowID = Liste_Fenetres()
          WindowID = LastWindowID
        EndIf
      Wend
      
      If LastWindowID <> WindowID
        ; On vérifie le nom du programme dont on vient de récupérer le handle
        GetWindowThreadProcessId_(LastWindowID, @pid)
        If OpenLibrary(9000, "kernel32.dll")
          Process32Search = CallFunction(9000, "CreateToolhelp32Snapshot", 2, 0)
          If Process32Search
            DefType.PROCESSENTRY32 Proc32
            Proc32\dwSize = SizeOf(PROCESSENTRY32)
            If CallFunction(9000, "Process32First", Process32Search, @Proc32)
              Repeat
                If pid = Proc32\th32ProcessID And LCase(GetFilePart(PeekS(@Proc32\szExeFile))) <> NomFichier$
                  WindowID = LastWindowID
                EndIf
              Until CallFunction(9000, "Process32Next", Process32Search, @Proc32) = 0
            EndIf
            CloseHandle_(Process32Search)
          EndIf
          CloseLibrary(9000)
        EndIf
      EndIf
      
    EndIf
  Until LastWindowID <> 0 And LastWindowID <> WindowID
  
  ProcedureReturn LastWindowID
EndProcedure






ID = RunProgramEx("Explorer.exe", "", "")

Debug "ID du programme lancé = " + Str(ID)
Texte.s = "Chopée"
SetWindowText_(ID, @Texte)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre