Bonjour
J’ai une question un peu superflu(pour vba Excel) est il possible de récupérer le handle d’une contrôle .
Merci d’avance
Bonjour
J’ai une question un peu superflu(pour vba Excel) est il possible de récupérer le handle d’une contrôle .
Merci d’avance
Bonjour,
Oui, c'est possible (bien que sous VBA), mais celà dépend du type de contrôle concerné ...
Quel contrôle, donc ?
Bonjour
des controle simples d'un userform listbox combobox button .........
Merci d'avance
Bonjour,
"contrôles simples" ne peut être une réponse...
Fais-en donc la liste exhaustive, s'il te plait... (tu comprendras pourquoi en tenant la solution en main ...)
Et pendant que nous y sommes : confirme s'il te plait qu'il s'agit bien de contrôles présents dans une UserForm de TON application, hein ... (si tel n'est pas le cas ===>> résultats non garantis et pouvant être assez drôles...)
Excuser moi je n’ai pas un projet précis mais j’ai toujours la question en tête le handle est très sollicite pas les bibliothèque voici un exemple que j’ai voulu réaliser mais cette source n'est pour vba Excel
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 'recherche rapide dans une ListBox Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _ ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long Private Const LB_FINDSTRINGEXACT As Long = &H1A2 Private Const LB_FINDSTRING As Long = &H18F Private Const LB_ERR As Long = -1 ' ' Entrées : ' LstBox : La ListBox dans laquelle on fait la recherche ' searchPattern : La chaine de caractère recherchée ' startIndex : (optionnel) Index de départ de la recherche ' exactMatch : (optionnel) Si True, la fonction recherche un item exactement égal à searchPattern ' Si False, la fonction recherche le premier item commençant par searchPattern ' ' Sorties : ' retourne l'index dans la liste de la première occurrence de l'élément recherché ' si rien n'est trouvé, la fonction retouren LB_ERR (-1) ' Private Function SearchListBox(lstBox As ListBox, ByVal searchPattern As String, _ Optional ByVal startIndex As Long = -1, _ Optional ByVal exactMatch As Boolean = False) As Long Dim searchType As Long If exactMatch Then searchType = LB_FINDSTRINGEXACT Else searchType = LB_FINDSTRING End If SearchListBox = SendMessage(lstBox.hwnd, searchType, startIndex, ByVal searchPattern) End Function ' ' Exemples d'utilisation ' ' cherche le premier item de list1 commençant par MART result = SearchListBox(List1, "MART") ' cherche le premier item de List1 exactement égal à "MARTINE" result = SearchListBox(List1, "MARTINE", , True) ' cherche le premier item de List1 commençant par "PIER", à partir de l'index 10 result = SearchListBox(List1, "PIER", 10)
Bon...
Tu vas comprendre pourquoi j'insistais...
Je viens de te préparer un petit truc qui va te sortir tous les hwnd (mais uniquement les "possibles") des contrôles placés sur ta UserForm.
Place sur ta userForm différents contrôles , parmi lesquels une listbox que tu nomeras list1 (qui va nous servir pour l'affichage)
Code pour un commandbutton sur ta UserForm :
Dans un module, maintenant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Option Explicit Private Sub Command1_Click() Set maliste = List1 ' d'où l'importance de nommer ici Dim couichwnd As Long couichwnd = FindWindow(vbNullString, Me.Caption) lstctrls couichwnd End Sub
Lance et vois ce qui se passe : tu auras le handle de chaque contrôle ayant un "titre" (caption ou texte d'une textbox), mais pas des autres ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 Option Explicit Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, _ ByVal lpString As String, ByVal lMax As Long) As Long Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Public maliste As Object Public Sub lstctrls(ByVal WindowHandle As Long) EnumChildWindows WindowHandle, AddressOf encore, 0 End Sub Public Function encore(ByVal hWnd As Long, ByVal lParam As Long) As Long Dim wintxt$, txtlen&, pos0 As Integer wintxt = Space$(256) GetClassName hWnd, wintxt, Len(wintxt) txtlen = GetWindowTextLength(hWnd) If txtlen > 0 Then wintxt = Space$(txtlen + 1) GetWindowText hWnd, wintxt, txtlen + 1 pos0 = InStr(wintxt, Chr(0)) maliste.AddItem Left(wintxt, pos0 - 1) & " ===>>> " & hWnd End If encore = 1 End Function
Voilà ...
Il se peut que tu découvres une imperfection du fait que je viens d'écrire ce code depuis VB6 et non depuis VBA (indisponible pour l'instant chez moi).
Si tel est le cas, parle-m'en et je corrigerai
EDIT : pour les autres contrôles, ceux qui n'ont ni caption ni texte), je viens de "bricoler" un peu et suis capable d'en connaître également le handle, mais sans pouvoir "relier" à un nom précis de contrôle (juste le type). Si le code ci-dessus ne te donne pas le handle d'une listbox (au hasard ...), je pourrais quand même l'extraire, mais à la seule condition que la dite ListBox soit la seule listbox sur ton UserForm ...
Tu dis ...
bonjour
j'ai testé il me renvoie une liste vide et quant je mets Application.Caption je peux voir le handle de userform1 et lorsqsue je survole le listbox par un utilitaire je recupere son handle par contre un button ou un combobox
j'ai une autre petite question comment je peux assigner une procedure vba au messages de windows
je te remercie ucfoutu beaucoup tu m'as appris une chose plus importante
Space$(256)
au passe je utilise
Private Type Users
name As String * 255
End Type
Que me racontes-tu là ?
Il se trouve que je viens de tester ===>> pas de problème !
Et qu'est donc ce "Application.Caption" que je n'ai mis nulle part ?
Dis-voir : tu travailles bien avec une UserForm et tes contrôles y sont, j'espère ...
bonjourOui j'ai mets une liste boxe et une button un combobox dans un userform et j'ai executer sous excel 2000 et 2007 il me renvoie une liste vide et quant je je change Me.Caption par Application.Caption je peux voir le handle de userform1 ===>> xxxxxxxxxxxxxxDis-voir : tu travailles bien avec une UserForm et tes contrôles y sont, j'espère ...
J’ai essaye encore ça ne marche pas je ne sais pas ou est le hic et ucfoutu n’intervient pas
Je ne suis pas intervenu car tu me donnes l'impression de patauger...
Tu veux du plus simple encore ?
Voilà, mais en donnant d'abord le focus à ta listbox ListBox1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Private Declare Function GetFocus Lib "user32" () As Long Private Sub Command1_Click() Listbox1.SetFocus tonhwnd = GetFocus() MsgBox "ta listbox Listbox1 a pour hwnd " & tonhwnd End Sub
Bonjour
enfin tu as poster quelque choseje ne sais pas si tu m’as piégé par ton premier code , pour te répondre je ne patauge pas il est simple pour trouver une solution sur le net mais je suis occupé par un autre programme php qui tient tout mon temps.
Ton dernier code marche bien mais il ne sera pas utilisable utiliser le focus serais terrible avec un class à l’initialisation ou avec un contrôle qui n’a pas cette propriété
1) quel serait donc le contrôle ne pouvant recevoir le focus et qui aurait un hwnd ????
2) tu disais en avoir besoin pour utiliser la fonction SendMessage de l'Api de Windows avec une ListBox (en substitution d'une boucle de recherche) ...
- une listbox peut recevoir le focus
- une listbox est une fenêtre Wondows et est dotée d'un hwnd...
Je te comprends de moins en moins (chez moi, tout marche... et sans problème...).
Je te signale à tout hasard (sait-on jamais...) qu'un hwnd n'est pas attribué par Windows à une fenêtre avant qu'elle ne soit affichée... qu'elle n'existe, donc...(c'est peut-être là ton erreur).
Au moment où Windows crée une fenêtre, il lui attribue un hwnd. Ce handle est un Long qui ne subit aucune modification de valeur TANT QUE la fenêtre existe. Il lui attribue un nouveau handle en cas de déchargement de la la fenêtre puis nouveau chargement de cette dernière.
J'espère que ces explications te permettront d'y voir plus clair dans ta démarche ...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager