récupérer le nom de l'exe à partir du handle de la fen
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
récupérer le nom de l'exe à partir du handle de la fen
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
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
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Code : Tout sélectionner
Nom$ = Space(255)
GetWindowModuleFileName_(WindowID(#Window_0), @Nom$,255)
Debug Nom$
Chris

-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
raté, il ne s'agit pas d'une fenêtre pb mais de celle autre programme
et je n'arrive à rien avec ça
je n'obtient que des ""

et je n'arrive à rien avec ça
Code : Tout sélectionner
ExeName.s = Space(255)
GetModuleFileName_(WinID, @ExeName, 255)
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
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.
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.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
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.
Après quoi tu peux récupérer le reste des infos comme indiqués plus haut.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.
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!
Chris 
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

-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
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
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
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Au début, tu mets ça
T'as jamais pensé à mettre tous les renseignements dans le même message ???
Ce serait certainement plus simple, tu ne pense pas?
Chris
Ensuite: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...
et ensuiteil ne s'agit pas d'une fenêtre pb mais de celle autre programme
Faudrait savoir ce que tu veux!en fait, je cherche à connaitre le handle la fenêtre ouverte après un runprogram
T'as jamais pensé à mettre tous les renseignements dans le même message ???
Ce serait certainement plus simple, tu ne pense pas?

Chris

Bon, c'est bien le handle de la fenêtre, que tu veux récupérer?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
T'est bien sûr ?
Y a pas de doute ??

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
Chris

-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
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
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
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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :
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
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

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)]
[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Une autre version, toujours de CodeArchiv.
Chris 
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))

-
- Messages : 4312
- Inscription : mer. 28/janv./2004 20:58
- Localisation : Clermont ferrand OU Olsztyn
- Contact :