Page 1 sur 2

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

Publié : sam. 22/mai/2004 14:06
par Le Soldat Inconnu
Salut,

je butte sur ceci :

j'ai chopé le handle d'une fenêtre et je souhaite connaître quel est le nom de l'exe qui a créé cette fenêtre, comment faire ? merci

Publié : sam. 22/mai/2004 14:12
par Chris

Code : Tout sélectionner

Nom$ = Space(255)
  GetWindowModuleFileName_(WindowID(#Window_0), @Nom$,255)
  Debug Nom$
Ca doit être ce que tu cherches.

Chris :)

Publié : sam. 22/mai/2004 14:14
par Le Soldat Inconnu
raté, il ne s'agit pas d'une fenêtre pb mais de celle autre programme :wink:

et je n'arrive à rien avec ça

Code : Tout sélectionner

ExeName.s = Space(255)
GetModuleFileName_(WinID, @ExeName, 255)
je n'obtient que des ""

Publié : sam. 22/mai/2004 14:21
par fweil
Et on peut également récupérer le PID et le Thread correspondant à la fenêtre pointée :

GetCursorPos_(@CurrentPoint.PONT)
WindowFromPoint = WindowFromPoint_(CurrentPoint\x, CurrentPoint\y)
Thread = GetWindowThreadProcessId_(WindowFromPoint, @PID)
debug Thread
debug PID

En croisant le nom du module, le process et le handle, on peut gérer les applications qui tournent pendant la session.

Publié : sam. 22/mai/2004 14:22
par Chris
Le Soldat Inconnu a écrit :raté, il ne s'agit pas d'une fenêtre pb mais de celle autre programme :wink:
T'aurais peut-être pu le préciser au départ !

Chris :)

Publié : sam. 22/mai/2004 14:39
par fweil
Pour récupérer les élements d'une fenêtre tierce, il faut soit pointer cette tierce fenêtre et utiliser WindowFromPoint_() (voir plus haut), soit faire une énumration des fenêtres pour récupérer le handle de celle que tu cherches (en vérifiant par rapport au titre de chaque fenêtre).

Après quoi tu peux récupérer le reste des infos comme indiqués plus haut.

Publié : sam. 22/mai/2004 15:38
par Chris
Je t'ai trouvé ça dans CodeArchiv.

Ca re retourne le nom de l'executable par rapport au handle de la fenêtre survolée par le curseur.

A toi d'adapter à ce que tu as besoin!

Code : Tout sélectionner

; English forum: http://purebasic.myforums.net/viewtopic.php?t=8555&highlight=
; Author: Hi-Toro
; Date: 30. November 2003

; ----------------------------------------------------------------------------- 
; Public domain -- Hi-Toro 2003 
; ----------------------------------------------------------------------------- 
; Return a window's process name from its handle... 
; ----------------------------------------------------------------------------- 

; IMPORTANT! You must paste the following section of code (from here to the 
; demo section) at the top of your code, AND paste the part at the bottom 
; (the 'GetProcessList' sub-routine) at the bottom of your code. The reason the 
; sub-routine is required (rather than a procedure) is that the Win32 function 
; 'Process32Next' seems to fail on Windows 9x when called from inside a procedure... 

; Note that you should always call 'GetProcessList' before trying to retrieve a window's process name... 

; ----------------------------------------------------------------------------- 
; Paste at top of your code... 
; ----------------------------------------------------------------------------- 

#TH32CS_SNAPHEAPLIST = $1 
#TH32CS_SNAPPROCESS = $2 
#TH32CS_SNAPTHREAD = $4 
#TH32CS_SNAPMODULE = $8 
#TH32CS_SNAPALL = #TH32CS_SNAPHEAPLIST | #TH32CS_SNAPPROCESS | #TH32CS_SNAPTHREAD | #TH32CS_SNAPMODULE 
#TH32CS_INHERIT = $80000000 
#INVALID_HANDLE_VALUE = -1 
#MAX_PATH = 260 
#PROCESS32LIB = 9999 

Structure PROCESSENTRY32 
    dwSize.l 
    cntUsage.l 
    th32ProcessID.l 
    *th32DefaultHeapID.l 
    th32ModuleID.l 
    cntThreads.l 
    th32ParentProcessID.l 
    pcPriClassBase.l 
    dwFlags.l 
    szExeFile.b [#MAX_PATH] 
EndStructure 

; List used to store processes on 'Gosub GetProcessList'... 

NewList Process32.PROCESSENTRY32 () 

; Returns process name from window handle... 
; IMPORTANT! You should 'Gosub GetProcessList' before calling this! 

Procedure.s FindWindowProcessName (window) 
    ResetList (Process32 ()) 
    While NextElement (Process32 ()) 
        GetWindowThreadProcessId_ (window, @pid) 
        If pid = Process32 ()\th32ProcessID 
            exe$ = GetFilePart (PeekS (@Process32 ()\szExeFile)) 
            LastElement (Process32 ()) 
        EndIf 
    Wend 
    ProcedureReturn exe$ 
EndProcedure 

; Returns Process ID from window handle... 

Procedure.l FindWindowProcessID (window) 
    GetWindowThreadProcessId_ (window, @pid) 
    ProcedureReturn pid 
EndProcedure 

; ----------------------------------------------------------------------------- 
; D E M O... 
; ----------------------------------------------------------------------------- 

window = OpenWindow (0, 0, 0, 320, 200, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Test window") 

; Update every 100 ms... 

SetTimer_ (WindowID (), 0, 100, 0) 

Repeat 
    Select WaitWindowEvent () 
        Case #PB_Event_CloseWindow 
            End 
        Case #WM_TIMER 
            ; Get process list... 
            Gosub GetProcessList 
            ; Get window under mouse position... 
            GetCursorPos_ (@p.POINT) 
            over = WindowFromPoint_ (p\x, p\y) 
            ; Find its name and set this window's title to it... 
            proc$ = FindWindowProcessName (over) 
            SetWindowText_ (window, proc$) 
    EndSelect 
ForEver 

; ----------------------------------------------------------------------------- 
; Paste at bottom of your code... 
; ----------------------------------------------------------------------------- 

End ; Leave this here! 

GetProcessList: 

    ClearList (Process32 ()) 

    ; Add processes to Process32 () list... 

    If OpenLibrary (#PROCESS32LIB, "kernel32.dll") 

        snap = CallFunction (#PROCESS32LIB, "CreateToolhelp32Snapshot", #TH32CS_SNAPPROCESS, 0) 

        If snap 

            DefType.PROCESSENTRY32 Proc32 
            Proc32\dwSize = SizeOf (PROCESSENTRY32) 
            
            If CallFunction (#PROCESS32LIB, "Process32First", snap, @Proc32) 

                AddElement (Process32 ()) 
                CopyMemory (@Proc32, @Process32 (), SizeOf (PROCESSENTRY32)) 
                
                While CallFunction (#PROCESS32LIB, "Process32Next", snap, @Proc32) 
                    AddElement (Process32 ()) 
                    CopyMemory (@Proc32, @Process32 (), SizeOf (PROCESSENTRY32)) 
                Wend 
                
            EndIf    
            CloseHandle_ (snap) 
        
        EndIf 

        CloseLibrary (#PROCESS32LIB) 
        
    EndIf 

Return 
Chris :)

Publié : sam. 22/mai/2004 16:21
par Le Soldat Inconnu
y'a surement plus simple mais le code de ton post marche Chris.

en fait, je cherche à connaitre le handle la fenêtre ouverte après un runprogram

j'ai fait ça mais, c'est pas génial

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()
Procedure.l RunProgramEx(NomFichier$, Parametre$, RepertoireCourant$)
  ClearList(Liste_Fenetres())
  
  ; On liste les fenêtres ouvertes
  WindowID.l = FindWindow_(0, 0)
  While WindowID <> 0
    If GetWindowLong_(WindowID, #GWL_STYLE) & #WS_VISIBLE
      AddElement(Liste_Fenetres())
      Liste_Fenetres() = WindowID
    EndIf
    WindowID = GetWindow_(WindowID, #GW_HWNDNEXT)
  Wend
  
  ; Fenêtre au premier plan
  WindowID = GetForegroundWindow_()
  
  ; On lance le programme
  Debug RunProgram(NomFichier$, Parametre$, RepertoireCourant$)
  
  NomFichier$ = GetFilePart(NomFichier$)
  
  ; On cherche l'ID du la fenêtre créée
  Time = GetTickCount_()
  Repeat
    Delay(50)
    LastWindowID = GetForegroundWindow_()
    If GetTickCount_() - Time > 10000
      ProcedureReturn 0
    EndIf
    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 GetWindowLong_(LastWindowID, #GWL_STYLE) & #WS_VISIBLE = 0
        WindowID = LastWindowID
        AddElement(Liste_Fenetres())
        Liste_Fenetres() = WindowID
      EndIf
      
    EndIf
    
  Until LastWindowID <> 0 And LastWindowID <> WindowID
  
  ProcedureReturn LastWindowID
EndProcedure






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

If ID
  Debug "ID du programme lancé = " + Str(ID)
Else
  Debug "Impossible de trouver la une nouvelle fenêtre"
EndIf

Publié : sam. 22/mai/2004 16:40
par Chris
Au début, tu mets ça
j'ai chopé le handle d'une fenêtre et je souhaite connaître quel est le nom de l'exe qui a créé cette fenêtre...
Ensuite:
il ne s'agit pas d'une fenêtre pb mais de celle autre programme
et ensuite
en fait, je cherche à connaitre le handle la fenêtre ouverte après un runprogram
Faudrait savoir ce que tu veux!
T'as jamais pensé à mettre tous les renseignements dans le même message ???

Ce serait certainement plus simple, tu ne pense pas? :)

Chris :)

Publié : sam. 22/mai/2004 16:49
par Chris
Regis a écrit :en fait, je cherche à connaitre le handle la fenêtre ouverte après un runprogram

j'ai fait ça mais, c'est pas génial
Bon, c'est bien le handle de la fenêtre, que tu veux récupérer?

T'est bien sûr ?

Y a pas de doute ?? :lol:

Alors, puisque c'est toi qui lance le programme, pourquoi tu ne fais pas tout simplement comme ça ?

Code : Tout sélectionner

RunProgram("Notepad"): Delay(50)
hNotepad = FindWindow_("Notepad",#Null)
Debug hNotepad
Le delay(50) permet de donner au programme le temps de s'ouvrir, sinon, le handle te retourne 0.

Chris :)

Publié : sam. 22/mai/2004 17:06
par Le Soldat Inconnu
findwindow ne marche que avec le nom de la fenêtre et je ne le connais pas à l'avance. ou alors j'ai rien compris à cette fonction. en plus, je peux avoir plusieurs fenêtre avec le même nom et la, findwindow ne veut plus rien dire.

je voulais trouver le nom de l'exe pour vérifier que j'avais bien récupérer le bon handle.

dans mon code, je fais ceci :
- je cherche les fenête déjà ouverte
- je lance mon prog avec runprogram
- je regarde si une nouvelle fenêtre passe au premier plan
- je regarde si cette fenêtre n'était pas déjà ouverte avant
- et donc je donne le handle de cette fenêtre en disant que c'est celle du programme que j'ai lancé

mais c'est pas glop comme truc car si j'ouvre plusieur prog en même temps, ça plante car ça ne récupère pas forcément la bonne fenêtre

Publié : sam. 22/mai/2004 17:08
par Le Soldat Inconnu
un autre truc, j'arrive à avoir le programme qui met plus de 10 secondes à s'ouvrir, tout dépend de ce que je fais à coté.
il faut donc que code scrute ^jusqu'à ce que la fenêtre apparaîsse, il ne faut pas un temps fixe :)

je suis chi...., hein :lol:

Publié : sam. 22/mai/2004 17:27
par Chris
je suis chi...., hein
Oh!! Si peu!!!! :lol:

Chris :)

Publié : sam. 22/mai/2004 22:05
par Chris
Une autre version, toujours de CodeArchiv.

Code : Tout sélectionner

; English forum: http://purebasic.myforums.net/viewtopic.php?t=6753&highlight=
; Author: Eddy
; Date: 29. June 2003


; RunProgramEx : retrieve handle of opened window 

; /////////////////////// 
; Run Program Ex 
; /////////////////////// 

Procedure.l RunProgramEx(Filename.s, Parameter.s, Directory.s, ShowFlag.l) 

   Info.STARTUPINFO 
   Info\cb          =SizeOf(STARTUPINFO)    
   Info\dwFlags     =1                    ;#STARTF_USESHOWWINDOW 
   Info\wShowWindow =ShowFlag 
    
   ProcessInfo.PROCESS_INFORMATION    
   ProcessPriority=$20                    ;NORMAL_PRIORITY 
      
  ;Create a window and retrieve its process 
  If CreateProcess_(@Filename, @Parameter, 0, 0, 0, ProcessPriority, 0, @Directory, @Info, @ProcessInfo) 

      ;Process Values      
      ProcessID.l =ProcessInfo\dwProcessId 

      ;Find Window Handle of Process 
      Repeat 
         win=FindWindow_(0,0) 
         While win<>0 And quit=0 
            GetWindowThreadProcessId_(win, @pid.l) 
            If pid=ProcessID 
              WinHandle=win
               quit=1 
            EndIf 
            win=GetWindow_(win, #GW_HWNDNEXT)          
         Wend 
      Until WinHandle 
    EndIf 
   ;Retrieve Window Handle 
   ProcedureReturn WinHandle 
EndProcedure 


; ///////////////////////////// 
; System Directory 
; ///////////////////////////// 

Procedure.s GetSystemDir() 
   systemdir$=Space(255) 
   lg = GetSystemDirectory_(systemdir$, 255) 
   systemdir$=Left(systemdir$,lg) 
   ProcedureReturn systemdir$ 
EndProcedure 

app=RunProgramEx(GetSystemDir()+"\notepad.exe","",GetSystemDir()+"\",#SW_SHOWNORMAL)

; J'ai commenté ça, c'est inutile pour la fonction
;    ExStyle.l  =GetWindowLong_(app,#GWL_EXSTYLE) 
;    ExStyle = ExStyle | #WS_EX_TOOLWINDOW 
;    SetWindowLong_(app,#GWL_EXSTYLE, ExStyle) ;Tool Style 
;    SetWindowPos_(app,#HWND_TOPMOST,0,0,0,0,16|2|1)     ;Always on top  

; J'ai juste rajouté ça pour visualiser le handle de la fenêtre
Delay(50)
SetWindowText_(app,Str(app))
Chris :)

Publié : dim. 23/mai/2004 14:19
par Le Soldat Inconnu
juste un problème, ce code ne marche pas avec l'explorateur windows :(