Code : Tout sélectionner
; Auteur : Chris
; Version de PB : 4
;
; Explication du programme :
; Pour connaître toutes les informations concernant l'objet sous la souris
; Question : Comment pourrais je savoir quel est le gadget présent sous la souris ?
;- Enumérations
Enumeration
#Window_0
EndEnumeration
Enumeration
#Btn_Ok
#String_0
#IP_0
#Combo_0
#List_0
#Btn_Img_0
#Progress_0
#Track_0
#Btn_Quit
#Btn_Cancel
EndEnumeration
; Appels de Structures. <-- Je sais pas si on dit ça, mais je me comprends.
CurPos.POINT
R.RECT
Parent.RECT
FP.RECT
;- Procédures
Procedure Open()
If OpenWindow(#Window_0, 300, 200, 400, 360, "Détection des objets", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget, 0)
hwnd = WindowID(#Window_0)
SetWindowPos_(hwnd, #HWND_TOPMOST, WindowX(#Window_0), WindowY(#Window_0), WindowWidth(#Window_0), WindowHeight(#Window_0) + 32, #SWP_SHOWWINDOW)
If CreateGadgetList(hwnd)
EditorGadget(#String_0, 5, 5, 385, 320)
For i = 0 To 22
AddGadgetItem(#String_0, -1, " ")
Next
ButtonGadget(#Btn_Quit, 150, 330, 100, 25, "Quit")
ProcedureReturn hwnd
EndIf
EndIf
EndProcedure
Procedure SetText(Handle, x, y, w, h, hParent, h_hParent, xP, yP, wP, hP, IDWindow, Name$, NameParent$)
If hParent = 0 : NameParent$ = "Aucun" : EndIf
SetGadgetItemText(#String_0, 0, "--------- Références de l'objet pointé", 0)
SetGadgetItemText(#String_0, 2, "Handle de l'objet= " + Str(Handle), 0)
SetGadgetItemText(#String_0, 3, "Position X = " + Str(x), 0)
SetGadgetItemText(#String_0, 4, "Position Y = " + Str(y), 0)
SetGadgetItemText(#String_0, 5, "Largeur = " + Str(w), 0)
SetGadgetItemText(#String_0, 6, "Hauteur = " + Str(h), 0)
SetGadgetItemText(#String_0, 7, "ID de l'objet = " + Str(IDWindow), 0)
SetGadgetItemText(#String_0, 8, "Nom de classe = " + Name$, 0)
SetGadgetItemText(#String_0, 10, "--------- Références du parent direct", 0)
SetGadgetItemText(#String_0, 12, "Handle du Parent = " + Str(hParent), 0)
SetGadgetItemText(#String_0, 13, "Position X du Parent = " + Str(xP), 0)
SetGadgetItemText(#String_0, 14, "Position Y du Parent = " + Str(yP), 0)
SetGadgetItemText(#String_0, 15, "Largeur du Parent = " + Str(wP), 0)
SetGadgetItemText(#String_0, 16, "Hauteur du Parent = " + Str(hP), 0)
SetGadgetItemText(#String_0, 17, "Nom de classe = " + NameParent$, 0)
SetGadgetItemText(#String_0, 19, "--------- Références de la première fenêtre", 0)
SetGadgetItemText(#String_0, 21, "Handle fenêtre Mère = " + Str(h_hParent), 0)
EndProcedure
;- Programme
hwnd = Open()
SetTimer_(hwnd, 1, 50, 0)
Repeat
GetCursorPos_(CurPos) ; Position du curseur
; / Relatif à la Zone survolée
Handle = WindowFromPoint_(CurPos\x, CurPos\y) ; Handle de la zone survolée
GetWindowRect_(Handle, R) ; Dimensions de la zone survolée
hParent = GetParent_(Handle)
If hParent <> 0 ; Si "Handle" à un parent
tmp = hParent ; stockage temporaire du handle du parent
Repeat
hTemp = GetParent_(tmp) ; Recherche du parent
If hTemp = 0 ; Si la recherche donne 0, le handle précédent est celui
h_hParent = tmp ; de la fenêtre mère
GetWindowRect_(h_hParent, FP)
Break
Else
tmp = hTemp
EndIf
Until hTemp = 0
EndIf
x = R\left : y = R\top : x2 = R\right : y2 = R\bottom : w = x2 - x : h = y2 - y
xP = FP\left : yP = FP\top : x2P = FP\right : y2P = FP\bottom : wP = x2P - xP : hP = y2P - yP
x - xP : y - yP
IDWindow = GetWindowLong_(Handle, #GWL_ID)
Name$ = Space(256)
GetClassName_(Handle, @Name$, 256)
NameParent$ = Space(256)
GetClassName_(hParent, @NameParent$, 256)
EventID = WaitWindowEvent(1000)
;Delay(1000)
Select EventID
Case #WM_TIMER
SetText(Handle, x, y, w, h, hParent, h_hParent, xP, yP, wP, hP, IDWindow, Name$, NameParent$)
Case #PB_Event_CloseWindow : Quit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case #Btn_Quit : Quit = 1
EndSelect
EndSelect
Until Quit = 1 : End
Change au niveau du "WaitWindowEvent()", en commentant/décommentant ce qu'il faut. Tu verras qu'avec le Delay() c'est frezzé (normal) alors qu'en utilisant le paramètre optionnel (nommé, pas pour rien, "TimeOut" dans la doc) que le résultat n'est pas du tout identique !!!