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

VBA Discussion :

CUIAutomation comment utiliser ElementFromPoint ?


Sujet :

VBA

  1. #1
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut CUIAutomation comment utiliser ElementFromPoint ?
    UIAutomationClient.CUIAutomation a une méthode ElementFromPoint


    https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

    mais impossible de l'utiliser j'obtiens un message d'erreur lors de la compilation
    Nom : Capture_elementfrompoint.PNG
Affichages : 811
Taille : 16,5 Ko
    Pouvez vous m'expliquer comment l'utiliser ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub testpoint()
    'il faut ajouter une reference à UIAUTOMATIONCLIENT
        Dim uiAuto As New UIAutomationClient.CUIAutomation
        Dim elmRibbon As UIAutomationClient.IUIAutomationElement
        Dim pt As UIAutomationClient.tagPOINT
     
        pt.x = 541
        pt.Y = 99
     
        Set elmRibbon = uiAuto.ElementFromPoint(pt)
    End Sub

  2. #2
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 948
    Points
    2 948
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    à tenter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Type POINT
        x As Long
        y As Long
    End Type
     
    Sub Test()
    Dim uiAuto As New UIAutomationClient.CUIAutomation
    Dim elmRibbon As UIAutomationClient.IUIAutomationElement
    Dim pt As POINT
     
        pt.x = 541
        pt.Y = 99
        Set elmRibbon = uiAuto.ElementFromPoint(pt.x, pt.y)
    End Sub
    Cordialement,
    Franck

  3. #3
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Bonjour,

    Merci de t'intéresser à mon problème.

    Malheureusement cela ne focntionne pas même message d'erreur.

  4. #4
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 948
    Points
    2 948
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Citation Envoyé par Oliv- Voir le message
    Merci de t'intéresser à mon problème.

    Malheureusement cela ne fonctionne pas même message d'erreur.
    Bah oui. Et rien sur le net (j'ai vu tes recherches...).

    Alors, je ne connais absolument pas cette librairie UIAutomationClient, mais avec des fonctions de l'API, il y a peut-être moyen de contourner.

    Regarde et teste ce code :
    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
    Option Explicit
     
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare Function WindowFromPoint Lib "user32" (ByVal xpoint As Long, ByVal ypoint As Long) As Long
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, _
        ByVal lpString As String, ByVal cch As Long) As Long
     
    Private Type POINTAPI
        X As Long
        Y As Long
    End Type
     
    Sub Test()
    Dim uiAuto As New UIAutomationClient.CUIAutomation
    Dim elmDesktop As UIAutomationClient.IUIAutomationElement
    Dim Children As UIAutomationClient.IUIAutomationElementArray
    Dim Cond As UIAutomationClient.IUIAutomationCondition
    Dim i As Long
    Dim myWindow As Long, sText As String
    Dim pt As POINTAPI
     
        sText = String(255, vbNullChar)
     
        GetCursorPos pt                                 'position du curseur
        myWindow = WindowFromPoint(pt.X, pt.Y)          'handle de la fenêtre sous le curseur
        myWindow = GetWindowText(myWindow, sText, 255)  'Caption de cette fenêtre
        sText = Left(sText, InStr(1, sText, vbNullChar) - 1)
     
        Set Cond = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, sText)    'condition : fenêtre Nom = sTxt (caption ci-dessus)
        Set elmDesktop = uiAuto.GetRootElement()                         'Element = bureau
        Set Children = elmDesktop.FindAll(TreeScope_Children, Cond)      'Recherche tous les enfants de Element
        For i = 0 To Children.Length - 1                                'répondant à notre condition
            Debug.Print Children.GetElement(i).CurrentName
        Next
    End Sub
    EDIT :
    Un second code qui passe non plus par le caption, mais par le ClassName.
    Utile si plusieurs fenêtres de la même application sont ouvertes...
    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
    Option Explicit
     
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare Function WindowFromPoint Lib "user32" (ByVal xpoint As Long, ByVal ypoint As Long) As Long
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, _
        ByVal lpString As String, ByVal cch As Long) As Long
    Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, _
        ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
     
    Private Type POINTAPI
        X As Long
        Y As Long
    End Type
     
    Sub Test_2()
    Dim uiAuto As New UIAutomationClient.CUIAutomation
    Dim elmDesktop As UIAutomationClient.IUIAutomationElement
    Dim Children As UIAutomationClient.IUIAutomationElementArray
    Dim Cond As UIAutomationClient.IUIAutomationCondition
    Dim i As Long
    Dim myWindow As Long, sText As String
    Dim pt As POINTAPI
     
        sText = String(255, vbNullChar)
     
        GetCursorPos pt                                 'position du curseur
        myWindow = WindowFromPoint(pt.X, pt.Y)          'handle de la fenêtre sous le curseur
        'myWindow = GetWindowText(myWindow, sText, 255)  'Caption de cette fenêtre
        myWindow = GetClassName(myWindow, sText, 255)
        sText = Left(sText, InStr(1, sText, vbNullChar) - 1)
        Set Cond = uiAuto.CreatePropertyCondition(UIA_ClassNamePropertyId, sText)
        'Set Cond = uiAuto.CreatePropertyCondition(UIA_NamePropertyId, sText)     'condition : fenêtre Nom = sTxt (caption ci-dessus)
        Set elmDesktop = uiAuto.GetRootElement()                         'Element = bureau
        Set Children = elmDesktop.FindAll(TreeScope_Children, Cond)      'Recherche tous les enfants de Element
        For i = 0 To Children.Length - 1                                'répondant à notre condition
            Debug.Print Children.GetElement(i).CurrentName
        Next
    End Sub
    Cordialement,
    Franck

  5. #5
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Citation Envoyé par pijaku Voir le message
    Bonjour,

    Bah oui. Et rien sur le net (j'ai vu tes recherches...).
    Salut, Comment cela tu travailles chez GOOGLE ! ;-)

    Alors, je ne connais absolument pas cette librairie UIAutomationClient, mais avec des fonctions de l'API, il y a peut-être moyen de contourner.
    En l'état cela ne fonctionne pas, en tout cas pour ce que je veux faire, c'est à dire capturer des éléments du RUBAN.

    Je parviens à obtenir le nom via IACCESSIBLE mais pas l'ensemble des informations comme les tips
    (https://www.developpez.net/forums/d1...nque-helptext/)

    C'est quand même incroyable que ElementFromPoint ne soit pas utilisable, ca doit être un bug dans le COM

  6. #6
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 948
    Points
    2 948
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Oliv- Voir le message
    C'est quand même incroyable que ElementFromPoint ne soit pas utilisable, ca doit être un bug dans le COM
    Je ne sais pas si c'est un bug, mais ElementFromHandle ne semble pas non plus fonctionner.

    J'ai tenté également la Fonction : GetCurrentPropertyValue, rien de mieux.

    Selon l'aide en ligne de la fonction GetCurrentPropertyValueEx :
    If the Microsoft UI Automation provider for the element itself supports the property, the value of the property is returned. Otherwise, if ignoreDefaultValue is FALSE, a default value specified by UI Automation is returned.
    Je dirais donc que le provider d'automation Microsoft UI de l'élément lui-même, ne supporte pas (plus) ces propriétés...
    Cordialement,
    Franck

  7. #7
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    ElementfromHandle Fonctionne
    par exemple :

    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
    Dim h As LongPtr
    Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
     
    Sub Download()
        Dim o As IUIAutomation
        Dim e As IUIAutomationElement
        Set o = New CUIAutomation
        h = Application.hwnd
        h = FindWindowEx(h, 0, "XLDESK", vbNullString)
        h = FindWindowEx(h, 0&, "EXCEL7", vbNullString)
     
        If h = 0 Then Exit Sub
     
        Set e = o.ElementFromHandle(ByVal h)
        MsgBox e.CurrentName
    End sub
    Si tu regarde l'autre fil que j'avais créé, je parlais des outils comme UISpy.exe ou Inspect.exe avec eux tu vois que cela doit fonctionner !

  8. #8
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 948
    Points
    2 948
    Billets dans le blog
    10
    Par défaut
    Bonjour Oliv,

    Ce que je penses du message d'erreur...
    Un type défini par l'utilisateur ne peut pas être passé ByVal, alors que pt est déclaré As tagPOINT (qui n'est pas un type défini par l'utilisateur), me fait penser qu'il manque une référence dans le projet.
    Il y a peut être une référence qui permet l'utilisation de la structure Point dans le cas de UIAutomation...
    Ou pas.
    C'est la seule piste que je voie dans ce sujet...

    Désolé.
    Par contre, si tu ne trouves pas de solution, il y a peut être une manière de parvenir à tes fins (mais là il faudrait savoir exactement ce que tu veux faire) via les fonctions api...
    Cordialement,
    Franck

  9. #9
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Bonjour Franck,
    Intéressant je vais explorer cela.

    Penses tu qu'on puisse appeler cette fonction comme une api ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    alors j'ai testé mais suis une quiche en API, par contre en mettant byref je n'ai pas le message d'erreur

    Nom : Capture.PNG
Affichages : 736
Taille : 19,8 Ko

  10. #10
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 948
    Points
    2 948
    Billets dans le blog
    10
    Par défaut
    Ton idée pourrait fonctionner si :
    1. Tu disposais du nom exact de la fonction,
    2. Tu connaissais les paramètres précis à lui passer (notamment l'objet sur lequel rattacher cet élément),

    De plus, si la méthode ne fonctionne pas avec le paramètre pt as tagPoint, cela m'étonnerait qu'il soit accepté par ce biais...
    Cordialement,
    Franck

  11. #11
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20

  12. #12
    Membre émérite
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 814
    Points : 2 948
    Points
    2 948
    Billets dans le blog
    10
    Par défaut
    L'explorateur de projet ne trouve par cette fonction dans la Library UIAutomationClient (UIAutomationCore.dll)...
    Cordialement,
    Franck

  13. #13
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    bonjour
    attention jusqu'à 2010 et peut etre plus (je sais pas ,pas testé) cette librairie n'est pas effective si l'astuce de marc n'est pas effectuée même si elle est bien cochée dans les ref

    il se trouve aussi qu'elle perds certaines de ces fonctions en late biding

    astuce de marc:

    simuler "enregister sous.... choisir system32 puis annuler et enregistrer vraiment la ou on veut et la librairie sera operationelle
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  14. #14
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Salut Patrick,
    Ici ce n'est pas le problème en fait la fonction est DEPRECATED donc elle n'apparait.
    Par contre si tu as une idée pour utiliser ElementFromPoint, ce serait super

  15. #15
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    en fait quoique l'on indique dans la parenthèse renvoi la même erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set elmRibbon = uiAuto.ElementFromPoint(application)

  16. #16
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    oui j'ai essayé moi meme avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    type point
    x as variant
    y as variant
    end type 
     
    dim pt as point
    pt.x=xxx
    pt.y=yyy
    uiui.elementfrompoint.....
    toujours l'erreur du "byval"
    demande a marcL il a l'air de bien s'intéresser a uiauto
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  17. #17
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    salut oliv
    selon ton besoin
    j'entends par la que si tu ne cherche pas a avoir toutes les propriétés des boutons du ruban du peut utiliser ne autre fonction mixer avec de la librairie uiauto

    je parle de la fonction "AccessibleObjectFromPoint" de la librairie "Oleacc"

    qui t'en donne le texte de la caption
    par ingenerie inverse tu peut rechercher ensuite en bouclent sur un object commandbar et ses controls et la en recupérer toutes les propriété

    exemple que j'ai pécho
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Option Explicit
    Private Type POINTAPI
        x As Long
        Y As Long
    End Type
    #If VBA7 Then
        Private Declare PtrSafe Function GetCursorPos Lib "user32.dll" (lpPoint As POINTAPI) As Long
        Private Declare PtrSafe Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
        #If Win64 Then
            Private Declare PtrSafe Function AccessibleObjectFromPoint Lib "Oleacc" (ByVal arg1 As LongPtr, ppacc As IAccessible, pvarChild As Variant) As Long
            Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As LongPtr)
        #Else
            Private Declare PtrSafe Function AccessibleObjectFromPoint Lib "Oleacc" (ByVal lX As Long, ByVal lY As Long, ppacc As IAccessible, pvarChild As Variant) As Long
        #End If
    #Else
        Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
        Private Declare Function AccessibleObjectFromPoint Lib "Oleacc" (ByVal lX As Long, ByVal lY As Long, ppacc As IAccessible, pvarChild As Variant) As Long
        Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    #End If
    Private Const CHILDID_SELF = &H0&
    Private Const S_OK As Long = &H0
     
    Sub Sample2()
    'move the mouse on PASTE BUTTON
        'Beep
        Application.OnTime DateAdd("s", 3, Now), "get_element_under_mouse"
    End Sub
    Private Sub get_element_under_mouse()
        Dim oIA As IAccessible
        Dim oCmbar As CommandBar
        Dim lResult As Long
        Dim tPt As POINTAPI
        Dim oButton As IAccessible
        GetCursorPos tPt
        #If Win64 Then
            Dim lngPtr As LongPtr
            CopyMemory lngPtr, tPt, LenB(tPt)
            lResult = AccessibleObjectFromPoint(lngPtr, oIA, 0)
        #Else
            lResult = AccessibleObjectFromPoint(tPt.x, tPt.Y, oIA, 0)
        #End If
        If lResult = S_OK Then
            '  On Error Resume Next
        End If
        Dim uiAuto As UIAutomationClient.CUIAutomation
        Dim elmRibbon As UIAutomationClient.IUIAutomationElement
        Dim uielmt As UIAutomationClient.IUIAutomationElement
        Dim cndProperty As UIAutomationClient.IUIAutomationCondition
        Dim i As Long
        On Error Resume Next
        Set uiAuto = New UIAutomationClient.CUIAutomation
        ' uiAuto.p
        Set elmRibbon = uiAuto.ElementFromIAccessible(oIA, 0)
        If Not elmRibbon Is Nothing Then
     
            MsgBox "Name: " & elmRibbon.CurrentName _
                 & vbCr & "------------------------------------" _
                 & vbCr & "CurrentHelpText: " & CStr(elmRibbon.CurrentHelpText), , "ui automation"
    End If
    End Sub
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  18. #18
    Expert éminent
    Avatar de Oliv-
    Homme Profil pro
    solution provider
    Inscrit en
    Mars 2006
    Messages
    4 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : solution provider

    Informations forums :
    Inscription : Mars 2006
    Messages : 4 087
    Points : 7 168
    Points
    7 168
    Billets dans le blog
    20
    Par défaut
    Salut Patrick,

    C'est pas un exemple à bibi que tu as pécho ? Hahaha (https://stackoverflow.com/questions/...ype-may-not-be)
    ici la version française : https://www.developpez.net/forums/d1...nque-helptext/


    par ingenerie inverse tu peut rechercher ensuite en bouclent sur un object commandbar et ses controls et la en recupérer toutes les propriété
    J'ai pas réussi justement à tout récupérer, quand je démarre de AccessibleObjectFromPoint je n'ai que le nom (currentName) Comment ferais tu ?

  19. #19
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    re
    oui je l'ai vu après que tu était dessus sur stak...

    je ferait tout simplement comme je t'ai dis plus haut
    un ingénierie inverse

    on a la caption on peut donc tout avoir par la commandbars non?
    j'ai essayé cela mais ca match pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set elmRibbon = uiAuto.ElementFromIAccessible(oIA, 0)
        If Not elmRibbon Is Nothing Then
            For Each cmb In CommandBars
                For Each ctrl In cmb
                    If ctrl.Caption Like "*" & elmRibbon.CurrentName & "*" Then MsgBox ctrl.ID
                Next
            Next
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  20. #20
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 379
    Points : 12 073
    Points
    12 073
    Billets dans le blog
    8
    Par défaut re
    le soucis c'est que la caption est la plus part du temps différente que ce qui est afficher
    alors que le nom par ui est écrit correctement
    tu peux tester comme ca
    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
    If Not elmRibbon Is Nothing Then
            For Each cmb In CommandBars
                For Each ctrl In cmb.Controls
                    If Trim(Replace(Replace(ctrl.Caption, "&", ""), ".", "")) = Trim(elmRibbon.CurrentName) Then
                        mess = "control " & Trim(elmRibbon.CurrentName) & vbCrLf
                        mess = mess & "Id= " & ctrl.ID & vbCrLf
                        mess = mess & "Description " & ctrl.Supertip & vbCrLf
                        mess = mess & "Dans la commandbar (" & cmb.Name & ")"
                        trouvé = True: Exit For
                    End If
                Next
                If trouvé = True Then Exit For
            Next
            MsgBox mess
            'MsgBox "Name: " & elmRibbon.CurrentName _
             & vbCr & "------------------------------------" _
             & vbCr & "CurrentHelpText: " & CStr(elmRibbon.CurrentHelpText), , "ui automation"
        End If
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 13h06
  2. Comment utiliser un cache ?
    Par TOM-Z dans le forum XMLRAD
    Réponses: 4
    Dernier message: 14/03/2003, 10h55
  3. comment utiliser actionscript ?
    Par webs dans le forum Flash
    Réponses: 3
    Dernier message: 10/02/2003, 00h11
  4. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 10h35
  5. Réponses: 5
    Dernier message: 11/06/2002, 16h21

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