IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

récupérer le handle d’un contrôle


Sujet :

Macros et VBA Excel

  1. #1
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut récupérer le handle d’un contrôle
    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

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour,

    Oui, c'est possible (bien que sous VBA), mais celà dépend du type de contrôle concerné ...
    Quel contrôle, donc ?

  3. #3
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Bonjour
    des controle simples d'un userform listbox combobox button .........
    Merci d'avance

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    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...)

  5. #5
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    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)

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    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 :

    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
    Dans un module, maintenant :

    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
    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 ...

    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 ...

  7. #7
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    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

  8. #8
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    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 ...

  9. #9
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    bonjour
    Dis-voir : tu travailles bien avec une UserForm et tes contrôles y sont, j'espère ...
    Oui 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 ===>> xxxxxxxxxxxxxx

  10. #10
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    J’ai essaye encore ça ne marche pas je ne sais pas ou est le hic et ucfoutu n’intervient pas

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par delphidelphi Voir le message
    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

  12. #12
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    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é

  13. #13
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    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 ...

Discussions similaires

  1. [VBA] Récupérer le handle d'un contrôle
    Par Tofalu dans le forum IHM
    Réponses: 6
    Dernier message: 13/06/2013, 10h04
  2. Réponses: 8
    Dernier message: 10/08/2008, 05h39
  3. Réponses: 7
    Dernier message: 14/01/2008, 18h48
  4. Récupérer le handle de contrôles qui ne sont pas atteignables par la souris
    Par olaf_le_preux dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 14/01/2008, 10h08
  5. Récupérer le Handle d'une Appli externe
    Par luxprog dans le forum Windows
    Réponses: 15
    Dernier message: 29/04/2004, 13h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo