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 :

Positionner curseur sur une cellule sélectée Windows Excel VBA


Sujet :

Macros et VBA Excel

  1. #741
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut
    re
    ma dernière version avec mon switch fonctionne déjà sur 7 versions différentes et tout les switch ne sont pas renseignés n'ayant pas les retours
    en 2 lignes
    j'ai tout dis
    "tu commence a comprendre"
    non!!
    ma question était y a til un moyen de remplacer le switch par une api ou autre object
    en aucun cas tu y a répondu directement
    c'est pourtant simple le mot "non" trois lettres
    alors après tu peux étaler toute ta science elle n'apporte absolument rien
    combien de fois je te l'ai dis tu fait des romans pour dire "non"
    donc depuis un moment tu me fait perdre mon temps
    et je suis assez bête pour te suivre c'est de ma faute tu m'y reprendra pas
    maintenant je vais suivre mes idées tu suis si tu veux .. ou pas
      0  1

  2. #742
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    ma question était y a til un moyen de remplacer le switch par une api ou autre object
    Ah ! Tu en viens alors à ce que tu disais vouloir éviter : l'utilisation de fonctions de l'Api de Windows.
    Et bien sûr, qu'il est possible de calculer dynamiquement par leur intermédiaire cette différence, et la réponse n'est donc pas "non" !
    Cette différence est tout simplement celle entre le top du hdc de la fenêtre de l'userform et le top du hdc de la fenêtre directx qui occulte celle du userform.
    Pas de problème avec cela, mais ce ne sera plus ton "challenge" (le faire sans utiliser l'api de windows), hein ...

    Mais attends mon message de demain, avant de te lancer dans ce qui s'avèrera une voie de toutes manières non souhaitable (ton alignement lui-même ne l'est pas)


    EDIT : et on n'a d'ailleurs même pas besoin de calculer cette différence. On connaît les coordonnées de l'angle supérieur gauche du userform (VBA les donne). On sait (fastoche) déterminer le hwnd de la fenêtre activex (suffit d'utiliser WindowFromPoint aux coordonnées de l'userform - 1 pixel tant en abscisse qu'en ordonnée). On est alors en mesure d'extraire son hdc puis, de là, d'en connaître les coordonnées de l'angle supérieur gauche (de la fenêtre directx, donc). Reste plus qu'à faire coincider avec l'angle supérieur gauche de la cellule (que l'on sait déterminer déjà, non ?)

    EDIT 2 : et on peut même faire encore plus simple, si l'on passe par l'utilisation de fonctions de l'Api de Windows --->>
    Il se trouve que la position de la barre de titre du Userform est sous celle de la fenêtre activex. Et on connait (VBA) les coordonnées de l'angle supérieur gauche du userform. En les utilisant avec WindowFromPoint :
    - ou on est dans le cas aero et ces coordonnées nous permettront de connaître le hwnd de la fenêtre au 1er plan (fenêtre directx)
    - ou on est sans aero et ces coordonnées nous permettront de connaître le hwnd de la fenêtre au premier plan (celle du Userform, puisque la seule présente dans ce cas)
    Dans un cas comme dans l'autre, on aura le hwnd de la fenêtre à traiter (qu'elle soit celle directx si aero ou non si pas aero)
    On extrait (api) le hdc de cette fenêtre , quelle qu'elle soit, donc, et on la place alors aux coordonnées qui nous intéressent : celle de l'angle supérieur gauche de la cellule (et cela - voir plus haut - nous savons les définir)

    Alors ?
    ---> aucun vrai souci si l'on utilise les fonctions de l'Api de Windows
    ---> une usine à gaz (scabreuse et incertaine) avec ton switch si on reste à ton "challenge" de ne faire qu'avec VBA

    Voilà voilà. Nous avons fait le tour complet, non ?
    Tant de pages pour en arriver là ...
      0  1

  3. #743
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    ok j'attend ton code de demain
    qui d'après ce que je comprends me donne le left du hdc que l'on comparera au left userform
    a demain alors je suis impatient
      0  1

  4. #744
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    ok j'attend ton code de demain
    Encore une lecture en diagonale, Patrick ?
    Où et quand ai-je promis un "code" ?
    Relis et voies ce que j'ai dit que tu auras demain : ce n'est pas un code.

    Et tu ne risques pas de l'avoir de ma part, ce "code" (je n'ai pas aero).
    Ecris-le toi-même. Je t'ai dit comment et avec quoi et tu n'es pas un newbie. C'est même le contraire, à t'entendre sans cesse clamer que tu es le plus malin, le plus fort, etc ...
    Et je me rappelle de surcroît que tu as écrit il y a peu que tu étais "very API" -->> montre-le. C'est le moment.

    EDIT : tiens ! Je vais te faire un petit cadeau
    Si tu vois mal comment extraire le hdc et l'utiliser, voilà du plus simple encore :
    La fonction SetWindowPos de la librairie User32 de l'Api de Windows
    Elle attend comme premier paramètre le hwnd de la fenêtre à positionner. Et je t'ai dit plus haut comment l'obtenir, ce hwnd, non ?
    Si cela ne te suffit pas, tu attends quoi de plus ? Que je donne la becquetée (tu préfères une cuillère en argent ou en inox ?) ?
    Tu vas t'y mettre, oui ?
    si VRAIMENT tu n'y parviens pas tout seul, je vais finir par te l'écrire, ce code tout bête, même si je n'ai pas aero pour le tester (en aveugle, donc) !
    Mais je veux d'abord te voir au moins le tenter, toi le "fortiche" et me montrer ce que tu as tenté d'écrire.
      0  1

  5. #745
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    si tu a raison pour le rangefrompoint et ton "-1"
    alors je pense éliminer le do loop et le remplacer par un getwindowrect sur le hdc
    j'essaierais demain
      0  1

  6. #746
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Je viens de t'indiquer du plus facile encore
    Sans aller chercher le rectangle avec le hdc.
    De l'utilisation directe du hwnd.
    Lis mon EDIT.

    Et plus besoin du -1 ! Tu devrais également lire mon EDIT 2 d'un message un peu plus haut !
      0  1

  7. #747
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    avec ton edit et plus haut ton edit2 tu m'a perdu

    tu parlais de -1 aussi
    mes tests avec aéro avec rangefromproint(même x, même Y) incrémenté de -1dans une boucle arrive a 5 pour changer de handle et cela change avec W10 selon version de 1 a -5
    et cela rien que pour le left il faut faire la même opération pour le top qui est diffèrent aussi selon les versions

    alors ou faut il taper sans boucle
    peut être avec l'api getparent
    je testerais ca demain soir en rentrant
      0  1

  8. #748
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    C'est incroyable (tu ne lis pas ou lis en diagonale) !
    Alors :
    1) mon EDIT 2 plus haut :
    EDIT 2 : et on peut même faire encore plus simple, si l'on passe par l'utilisation de fonctions de l'Api de Windows --->>
    Il se trouve que la position de la barre de titre du Userform est sous celle de la fenêtre activex. Et on connait (VBA) les coordonnées de l'angle supérieur gauche du userform. En les utilisant avec WindowFromPoint :
    - ou on est dans le cas aero et ces coordonnées nous permettront de connaître le hwnd de la fenêtre au 1er plan (fenêtre directx)
    - ou on est sans aero et ces coordonnées nous permettront de connaître le hwnd de la fenêtre au premier plan (celle du Userform, puisque la seule présente dans ce cas)
    Dans un cas comme dans l'autre, on aura le hwnd de la fenêtre à traiter (qu'elle soit celle directx si aero ou non si pas aero)
    On extrait (api) le hdc de cette fenêtre , quelle qu'elle soit, donc, et on la place alors aux coordonnées qui nous intéressent : celle de l'angle supérieur gauche de la cellule (et cela - voir plus haut - nous savons les définir)
    Plus besoin ni de ton "do loop", ni d'e ce -1
    Oublie maintenant (plus besoin non plus, ce que j'ai rayé
    2) pourquoi j'ai rayé ?
    Parce que plus besoin du hdc --->> mon EDIT --->>
    EDIT : tiens ! Je vais te faire un petit cadeau
    Si tu vois mal comment extraire le hdc et l'utiliser, voilà du plus simple encore :
    La fonction SetWindowPos de la librairie User32 de l'Api de Windows
    Elle attend comme premier paramètre le hwnd de la fenêtre à positionner. Et je t'ai dit plus haut comment l'obtenir, ce hwnd, non ?
    Que te faut-il de plus ? Dormir un peu, peut-être ...
      0  1

  9. #749
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    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 374
    Points : 12 068
    Points
    12 068
    Billets dans le blog
    8
    Par défaut re
    heu.. la fonction setwindowpos postionne elle ne lit pas
    j'ai déjà montrer sur ce post
    non je te suis pas, pas parce que je suis fatiguée mais parce que dans le do loop le hdc est bien diffèrent selon les version comme je te l'ai dis ca va de -5 a +5 est contrairement a W7 qui est de +4.4 left et +4.4 top

    le left et top n'ont pas le même ajustement

    donc ma question est simple comment sans "tatoner" avec un boucle tu le chope

    ma question est simple
    peu être te faudrait il une version plus récente de Windows pour te rendre compte que tu te trompe dans ton raisonnement
    edit:
    je viens de refaire mon test du do loop mais j'ai rajouter l'identification de la classe du handle obtenu avec getclassename sur un string*220 et au bout de 5 je tombe sur la classe "EXCELH" qui est la grille je tombe sur rien d'autre avec windowfrompoint
    voila
      0  1

  10. #750
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    heu.. la fonction setwindowpos postionne elle ne lit pas
    Laisse le "heu" dans son tiroir. Il n'apporte rien.
    Et on ne va l'utiliser que dans ce but : positionner !
    non je te suis pas, pas parce que je suis fatiguée mais parce que dans le do loop le hdc est bien diffèrent selon les version comme je te l'ai dis ca va de -5 a +5 est contrairement a W7 qui est de +4.4 left et +4.4 top
    n'a rien à voir à divers titres :
    1) bien évidemment que les hdc seront différents ! Je t'ai dit et redit que lorsque aero est activé, nous avons affaire à DEUX fenêtres distinctes : celle du userform et celle vraisemblablement créée avec directx. Celle du userform est TOUJOURS présente (avec SON hwnd et donc SON hdc).
    - lorsque aero est absent, celle du userform est à la fois la seule fenêtre présente et la seule affichée en premier plan (un seul hwnd - un seul hdc)
    - lorsque aero est activé, une fenêtre créée par directx s'affiche EN PLUS au premier plan, occultant celle du Userform (qui reste présente). C'est alors le hwnd de cette fenêtre directx (et plus celui de la fenêtre du userform) qui est intercepté (est interceptée la fenêtre au premier plan et non celle occultée)
    Et ce sera avec ces fenêtres-là (celle du seul userform si aero absent) et celle du userform ET celle de la fenêtre directx ajoutée (si aero est présent) que nous allons travailler.
    2) Dès lors , tous les "écarts" que tu mentionnes (tes -5, etc) ne nous intéressent plus du tout ET ON VA LES IGNORER TOTALEMENT.
    3) je t'ai déjà expliqué plus haut que nous allons (la dernière simplification que je t'ai dite) nous débarrasser également de l'extraction du hdc
    4) aucun loop ne sera nécessaire pour obtenir le hwnd de la fenêtre au premier plan et qui sera automatiquement et forcément (je t'en ai déjà exposé les raisons) :
    - soit celle du Userform (si aero n'est pas activé)
    - soit celle crée EN PLUS par directx (si aero est activé)
    - toujours vrai, donc !
    - et je t'ai expliqué dans l'un de mes derniers messages pourquoi le bon hwnd (celui de la fenêtre au premier plan DANS TOUS LES CAS DE FIGURE) sera forcément extrait par utilisation de WindowFromPoint en lui passant comme paramètre les coordonnées du ..... userform lui-même (qu'il soit ou non au premier plan)

    Lis, relis et relis encore ce que je viens d'écrire-là . Lis attentivement et non en diagonale. Chaque phrase, chaque mot qui y sont utilisés sont IMPORTANTS.

    Je sais que je t'ai largement "secoué" et "bousculé" cette nuit. Je ne l'ai pas fait pour rien et en aucun cas dans le but de t' "amoindrir". C'est avec beaucoup de véritable amitié que le grand-père que je suis a voulu réveiller son interlocuteur et le conduire à moins d'impulsivité, moins d'exubérance, moins de fantaisies "mouvantes", etc ... au bénéfice de plus de vraie réflexion et de calme

    J'avais prévu de te dire (c'était là ma promesse - et pas du "code") aujourd'hui pourquoi tu allais in fine devoir jeter aux oubliettes un tel alignement (et donc tout ce travail)
    Je vais remettre cela à plus tard et me consacrer à te suivre pour l'instant dans TA démarche dans un seul but : celui d'ouvrir ton esprit.

    J'attends de voir le code que tu vas au moins tenter d'écrire toi-même sur la base des indications que je t'ai données.
    Si tu as des difficultés, j'irai plus loin : je décrirai tout PAS à PAS et en commentant chaque pas (en disant pourquoi ceci et pourquoi cela).
    Je t'attends donc


    EDIT : tu te rappelles les trois petits tests que je t'ai fait faire hier ? Sais-tu quel était leur intérêt et pourquoi les résultats reportés m'ont conduit à dire que nous avions là affaire à une seconde fenêtre ?
    --->> tout simplement parce que cette fenêtre là ne pouvait être celle d'un userform. Un userform est composé d'une fenêtre principale (celle dont le hwnd correspond à la seule barre de titre) et d'une fenêtre fille, avec un autre hwnd. Or les résultats que tu as reportés donnent le même hwnd pour la barre de titre et pour l' "intérieur" de la fenêtre (en dessous de la barre de titre). --->> il ne peut donc dès lors s'agir de la fenêtre d'un userform.
    --->> le test 3 montre par ailleurs que continue à être présent le userform et que son hwnd est distinct de celui de la barre de titre : --->> nous avons dès lors la certitude absolue de la présence SIMULTANEE de deux fenêtres distinctes.
    Tu te demandais quel était le but de ces trois tests ? --->> tu sais maintenant qu'ils n'étaient pas faits au hasard, mais de manière réfléchie et méthodique, dans le but de déterminer très précisément ce à quoi nous avions affaire
      0  1

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

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Bonjour tout le monde,

    Je reviens là-dessus et sur les tests de Patrick.
    Citation Envoyé par unparia Voir le message
    EDIT : tu te rappelles les trois petits tests que je t'ai fait faire hier ? Sais-tu quel était leur intérêt et pourquoi les résultats reportés m'ont conduit à dire que nous avions là affaire à une seconde fenêtre ?
    --->> tout simplement parce que cette fenêtre là ne pouvait être celle d'un userform. Un userform est composé d'une fenêtre principale (celle dont le hwnd correspond à la seule barre de titre) et d'une fenêtre fille, avec un autre hwnd. Or les résultats que tu as reportés donnent le même hwnd pour la barre de titre et pour l' "intérieur" de la fenêtre (en dessous de la barre de titre). --->> il ne peut donc dès lors s'agir de la fenêtre d'un userform.
    --->> le test 3 montre par ailleurs que continue à être présent le userform et que son hwnd est distinct de celui de la barre de titre : --->> nous avons dès lors la certitude absolue de la présence SIMULTANEE de deux fenêtres distinctes.
    Tu te demandais quel était le but de ces trois tests ? --->> tu sais maintenant qu'ils n'étaient pas faits au hasard, mais de manière réfléchie et méthodique, dans le but de déterminer très précisément ce à quoi nous avions affaire
    Notamment pour ceci :
    Citation Envoyé par unparia Voir le message
    Or les résultats que tu as reportés donnent le même hwnd pour la barre de titre et pour l' "intérieur" de la fenêtre (en dessous de la barre de titre).
    Parce que, chez moi, ça n'est pas le cas...
    J'ai repris le test de Patrick, légèrement modifié pour que cela corresponde bien...
    Voici (la fenêtre application étant déjà réduite):
    le code utilisé :
    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
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
    Private Declare Function WindowFromPoint Lib "user32" (ByVal xpoint As Long, ByVal ypoint As Long) As Long
     
    Sub testunparia()
    Dim ppx As Single, ex1 As Long, ex2 As Long, ex3 As Long
        With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With
        With UserForm1:  .Show 0:  .Left = 100: .Top = 20: End With
        'on place le curseur tout contre (très légèrement en dessous et très légèrement à droite) de l'angle supérieur droit de la barre de titre
        SetCursorPos (UserForm1.Left + UserForm1.Width) * ppx + 1, (UserForm1.Top * ppx - 5)
        ex1 = WindowFromPoint((UserForm1.Left + UserForm1.Width) * ppx + 1, (UserForm1.Top * ppx - 5))
        'on place le curseur sur le "userform apparent", en plein milieu sous la barre de titre
        SetCursorPos (UserForm1.Left) * ppx + 100, (UserForm1.Top * ppx + 50)
        ex2 = WindowFromPoint((UserForm1.Left) * ppx + 100, (UserForm1.Top * ppx + 50))
        'le hwnd de l'userform réel (obtenu, LUI, par FINDWINDOWS
        ex3 = FindWindow(vbNullString, UserForm1.Caption)
        MsgBox "exercice1 handle obtenu = " & ex1 & vbCrLf & "exercice2 handle obtenu = " & ex2 & vbCrLf & "exercice3 handle obtenu = " & ex3
    End Sub
    les résultats :
    curseur tout contre handle obtenu = 590984
    curseur sur le userform apparent handle obtenu = 394382
    FINDWINDOWS handle obtenu = 590984
    Ce que j'appelle curseur (représenté par un point rouge dans l'image) sur le UserForm apparent :

    Pièce jointe 293751

    C'est bien celui-ci qui est différent...
    Ou alors je me fourvoie, une fois n'est pas coutume...

    J'ai même testé avec le curseur en plein milieu de la barre de titre avec ce code (ex4 en plus) :
    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
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
    Private Declare Function WindowFromPoint Lib "user32" (ByVal xpoint As Long, ByVal ypoint As Long) As Long
     
    Sub testunparia()
    Dim ppx As Single, ex1 As Long, ex2 As Long, ex3 As Long, ex4 As Long
        With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With
        With UserForm1:  .Show 0:  .Left = 100: .Top = 20: End With
        'on place le curseur tout contre (très légèrement en dessous et très légèrement à droite) de l'angle supérieur droit de la barre de titre
        SetCursorPos (UserForm1.Left + UserForm1.Width) * ppx + 1, (UserForm1.Top * ppx - 5)
        ex1 = WindowFromPoint((UserForm1.Left + UserForm1.Width) * ppx + 1, (UserForm1.Top * ppx - 5))
        'on place le curseur sur le "userform apparent", en plein milieu sous la barre de titre
        SetCursorPos (UserForm1.Left) * ppx + 100, (UserForm1.Top * ppx + 50)
        ex2 = WindowFromPoint((UserForm1.Left) * ppx + 100, (UserForm1.Top * ppx + 50))
        'le hwnd de l'userform réel (obtenu, LUI, par FINDWINDOWS
        ex3 = FindWindow(vbNullString, UserForm1.Caption)
        SetCursorPos (UserForm1.Left + 100) * ppx, (UserForm1.Top * ppx + 5)
        ex4 = WindowFromPoint((UserForm1.Left + 100) * ppx, (UserForm1.Top * ppx + 5))
        Debug.Print "curseur tout contre handle obtenu = " & ex1 & vbCrLf & "curseur sur le userform apparent handle obtenu = " & ex2 & vbCrLf & "FINDWINDOWS handle obtenu = " & ex3 & vbCrLf & "Curseur dans la barre de titre handle obtenu = " & ex4
    End Sub
    Et j'ai obtenu ces résultats :
    curseur tout contre handle obtenu = 984180
    curseur sur le userform apparent handle obtenu = 263464
    FINDWINDOWS handle obtenu = 984180
    Curseur dans la barre de titre handle obtenu = 984180
      0  1

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

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    J'ai voulu vérifier si toute cette "bordure" de l'userform possède le même handle que le centre...

    Image :
    Pièce jointe 293763
    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
    Private Declare Function WindowFromPoint Lib "user32" (ByVal xpoint As Long, ByVal ypoint As Long) As Long
     
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
     
    Private Type POINTAPI
        X As Long
        Y As Long
    End Type
     
    Sub testFranck()
    Dim Nb As Byte
    With UserForm1:  .Show 0:  .Left = 100: .Top = 20: End With
    'test à 10 endroits différents
        For Nb = 1 To 10
            MsgBox Nb & " vous avez 5 secondes pour positionner le curseur"
            Application.Wait (Now + TimeValue("00:00:05"))
            Debug.Print Return_Hwnd
        Next
    Unload UserForm1
    End Sub
     
    Function Return_Hwnd() As Long
    Dim pos As POINTAPI
        GetCursorPos pos
        Return_Hwnd = WindowFromPoint(pos.X, pos.Y)
    End Function
    Résultat, le handle du centre est différent de celui de toute la bordure, par contre toute la bordure possède le même handle...
      0  1

  13. #753
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Bonjour Franck
    Merci pour ce rapport.
    Mais voilà qui est inquiétant et laisserait alors penser que le test fait par patricktoulon a mal été fait et que les résultats que montre son message 722 sont erronés !
      0  1

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

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Je déduis des tests réalisés ce matin, que ce que l'on appelle UserForm :

    Pièce jointe 293770

    est en fait composé :
    d'un userform (en gris dans l'image et uniquement le gris, le bleu étant l'image qui recouvre l'Usf) :

    Pièce jointe 293771

    recouvert d'une image (en noir la transparence ou plutôt ce qui n'est pas recouvert par "l'image") :

    Pièce jointe 293775

    Ce que démontre Jacques depuis ...
      0  1

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

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

    Citation Envoyé par unparia Voir le message
    Bonjour Franck
    Merci pour ce rapport.
    De rien !

    Citation Envoyé par unparia Voir le message
    Mais voilà qui est inquiétant et laisserait alors penser que le test fait par patricktoulon a mal été fait et que les résultats que montre son message 722 sont erronés !
    Euh, pas erronés, mais mal faits, oui.

    Le second test que je propose peut-être réalisé partout car il est manuel...
      0  1

  16. #756
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    J'aimerais, Franck en avoir le coeur parfaitement net.
    Lis mon message 733 (j'y critique le code de Patrick et en propose un autre qui, lui, ne fait nullement appel à un placement par code du curseur).
    Peux-tu me dire ce que ce code te retourne pour chacune des trois mesures prises ?
    Et me confirmer que aero est bien activé lors de ces tests ?
      0  1

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

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Et me confirmer que aero est bien activé lors de ces tests ?
    Je ne sais pas comment faire pour activer et/ou désactiver ce machin... (cf EDIT)

    Mais bon, ton test manuel est quasiment le même que celui que je réalise à mon post d'aujourd'hui, 10h36.

    Mes conclusions d'alors sont confirmées par ton test 733 (que je viens de réaliser), à savoir :
    Le handle du centre est différent de celui de toute la bordure, par contre toute la bordure possède le même handle...

    Ce à quoi il convient d'ajouter ce qui fait la différence entre ton test est le mien, le résultat de FindWindow.
    FindWindow trouve le même handle que celui de la bordure.

    J'ajouterais ceci aux images que je viens de transmettre, concernant l'ombrage...
    L'ombre dans les coins arrondis de l'usf (en bleu dans l'image ci-dessous) fait partie de l'image qui le recouvre.
    Par contre, l'ombre sur les côtés ne fait plus partie de l'image (hwnd du bureau ou de la fenêtre ouverte derrière qui ressort).

    Pièce jointe 293798

    EDIT : aero est bien activé sur mon pc
      0  1

  18. #758
    Membre éclairé Avatar de Nicolas JACQUIN
    Homme Profil pro
    .
    Inscrit en
    Avril 2014
    Messages
    556
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : .
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2014
    Messages : 556
    Points : 790
    Points
    790
    Par défaut
    Bonjour à tous
    @Jacques, escuses moi pour hier soir le code j'ai pas compris ce qu'il fallait faire
    Là je viens de reprendre les test que pijaku à fait et voici le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test_unparia()
    Dim ppx As Single, ex1 As Long, ex2 As Long, ex3 As Long
        With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With
        With UserForm1:  .Show 0:  .Left = 100: .Top = 20: End With
        'on place le curseur tout contre (très légèrement en dessous et très légèrement à droite) de l'angle supérieur droit de la barre de titre
        SetCursorPos (UserForm1.Left + UserForm1.Width) * ppx + 1, (UserForm1.Top * ppx - 5)
        ex1 = WindowFromPoint((UserForm1.Left + UserForm1.Width) * ppx + 1, (UserForm1.Top * ppx - 5))
        'on place le curseur sur le "userform apparent", en plein milieu sous la barre de titre
        SetCursorPos (UserForm1.Left) * ppx + 100, (UserForm1.Top * ppx + 50)
        ex2 = WindowFromPoint((UserForm1.Left) * ppx + 100, (UserForm1.Top * ppx + 50))
        'le hwnd de l'userform réel (obtenu, LUI, par FINDWINDOWS
        ex3 = FindWindow(vbNullString, UserForm1.Caption)
        Debug.Print "exercice1 handle obtenu = " & ex1 & vbCrLf & "exercice2 handle obtenu = " & ex2 & vbCrLf & "exercice3 handle obtenu = " & ex3
    End Sub
    Nom : 2017-07-13_113610.png
Affichages : 149
Taille : 1,0 Ko
    exercice1 handle obtenu = 65812
    exercice2 handle obtenu = 2101116
    exercice3 handle obtenu = 2490458
    et le suivant
    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
    Sub testunparia()
    Dim ppx As Single, ex1 As Long, ex2 As Long, ex3 As Long, ex4 As Long
        With CreateObject("WScript.Shell"): ppx = .RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\AppliedDPI") / 72: End With
        With UserForm1:  .Show 0:  .Left = 100: .Top = 20: End With
        'on place le curseur tout contre (très légèrement en dessous et très légèrement à droite) de l'angle supérieur droit de la barre de titre
        SetCursorPos (UserForm1.Left + UserForm1.Width) * ppx + 1, (UserForm1.Top * ppx - 5)
        ex1 = WindowFromPoint((UserForm1.Left + UserForm1.Width) * ppx + 1, (UserForm1.Top * ppx - 5))
        'on place le curseur sur le "userform apparent", en plein milieu sous la barre de titre
        SetCursorPos (UserForm1.Left) * ppx + 100, (UserForm1.Top * ppx + 50)
        ex2 = WindowFromPoint((UserForm1.Left) * ppx + 100, (UserForm1.Top * ppx + 50))
        'le hwnd de l'userform réel (obtenu, LUI, par FINDWINDOWS
        ex3 = FindWindow(vbNullString, UserForm1.Caption)
        SetCursorPos (UserForm1.Left + 100) * ppx, (UserForm1.Top * ppx + 5)
        ex4 = WindowFromPoint((UserForm1.Left + 100) * ppx, (UserForm1.Top * ppx + 5))
        Debug.Print "curseur tout contre handle obtenu = " & ex1 & vbCrLf & "curseur sur le userform apparent handle obtenu = " & ex2 & vbCrLf & "FINDWINDOWS handle obtenu = " & ex3 & vbCrLf & "Curseur dans la barre de titre handle obtenu = " & ex4
    End Sub
    Nom : 2017-07-13_113713.png
Affichages : 166
Taille : 1 010 octets
    curseur tout contre handle obtenu = 65812
    curseur sur le userform apparent handle obtenu = 5376966
    FINDWINDOWS handle obtenu = 2755416
    Curseur dans la barre de titre handle obtenu = 2755416
      0  1

  19. #759
    Membre extrêmement actif
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Points : 12 433
    Points
    12 433
    Par défaut
    Le handle du centre est différent de celui de toute la bordure, par contre toute la bordure possède le même handle...
    Il s'agit là du comportement normal d'un userform
    Un userform est composé :
    - d'une fenêtre principale (délimitée par l'ensemble des bordures, barre de titre incluses)
    - d'une "fenêtre fille" (l' "intérieur" du userform)
    et on a donc deux hwnd l'un de la fenêtre principale et l'autre de la "fenêtre fille"
    C'est ce que je pense que l'utilisation de la fonction FindWindowEx de la librairie user32 de l'api de windows devrait pouvoir bien montrer.

    Ce qui m'inquiète beaucoup, c'est que le hwnd retourné par WindowfromPoint lorsque l'on est sur la barre de titre "affichée" est le même que celui retourné par findwindow pour le userform.
    Cela révèlerait alors que l'image affichée n'est pas une fenêtre à part entière (et que le hwnd retourné est alors celui de ce qui est derrière, à savoir la fenêtre du userform) . Et si tel est vraiment le cas, on l'a "in the baba" !
      0  1

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

    Informations forums :
    Inscription : Août 2010
    Messages : 1 816
    Points : 2 954
    Points
    2 954
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par unparia Voir le message
    Et si tel est vraiment le cas, on l'a "in the baba" !
    On l'a effectivement dans le baba car Nicolas confirme bien ce que je viens de dire.
      0  1

Discussions similaires

  1. se positionner sur une cellule
    Par titemireille dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/01/2008, 19h07
  2. cliquer sur une cellule qui m'ouvre un autre fichier excel
    Par booskap dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 17/08/2007, 11h08
  3. [VBA-Excel] DblClick sur une cellule
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/01/2007, 10h51
  4. [VBA-Excel]Supprimer une colonne entiere basee sur une cellule
    Par Tartenpion dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/10/2006, 22h08
  5. [Vba-Excel] Récupérer événement sur une cellule
    Par steps5ive dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/04/2006, 20h27

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