none
Utilisation de SetCursorPos et mouse_event possible sans focus ? RRS feed

  • Question

  • Bonjour,

    Je dois développer une application en C++ permettant de cliquer automatiquement sur les boutons des applications tiers n'ayant pas de lignes de commandes mais seulement un GUI.

    J'ai testé ceci : (include windows.h)

    SetCursorPos(X,Y);
    Sleep(500);
    Mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    Sleep(500);
    mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

    Ceci fonctionne,
    Mais si je ne "focus" pas la fenêtre (exécutant le code ci-dessus) la souris ne bouge et ne clique pas...

    Il y a t-il donc une solution permettant de changer la position du curseur et cliquer sans avoir a sélectionner la fenêtre exécutant le code ?

    Cordialement
    - - - - - - - - - - - - - - - - - - - -
    Sébastien FAVIER
    http://cpcdos.fr.nf/


    Microsf01 Favier Sébastien 01


    • Modifié Sébastien FAVIER vendredi 22 mai 2015 13:29 Erreur de syntaxe dans le titre
    vendredi 22 mai 2015 10:13

Réponses

Toutes les réponses

  • Oui, il y a des solutions mais elles sont bien plus complexes que de donner le focus à l'application pilotée.

    En quoi Est-ce gênant ?


    Paul Bacelar, Ex - MVP VC++

    lundi 25 mai 2015 21:43
    Modérateur
  • Bonjour, merci pour votre réponse.

    Cela pose problème lors ce que je veux cliquer graphiquement avec mouse_event() sur un bouton d'une autre application qui ne fait pas parti du processus/la classe de mon code.
    Si mon application n'a pas le focus, il ne peut pas "bouger" la souris.

    Je pense qu'il faut que je récupère le handle de la 2eme fenêtre, et faire un SendInput() pour simuler le clic. puisse qu'il marche a bas niveau d'après votre documentation.

    Es ce une solution?

    Cordialement


    Microsf01 Favier Sébastien 01


    mardi 26 mai 2015 07:20
  • C'est une solution à tester.

    Mais la fiabilité ne sera pas de 100% car le mode de récupération des entrées clavier et sourie et très variable en fonction du type d'application.


    Paul Bacelar, Ex - MVP VC++

    mardi 26 mai 2015 14:31
    Modérateur
  • Bonjour,

    La solution fonctionne, et oui effectivement il varie en fonction du type d'application.

    J'ai réussi à dessiner des points sur Paint.exe, Cliquer sur Calc.exe, explorer.exe, TeamViewer, notepad et autre...

    Seulement les applications de mon choix qui comprend CCleaner.exe, ADwcleaner.exe, MalwareBytes (mbam.exe) n’acceptent pas les évènements de la souris et clavier. Je pense qu'il y a un hook key ou autre qui empêche d'interagir (Peut être pour éviter les malwares a interagir avec les applications de nettoyage)

    Mais pourtant avec le clavier visuel de Microsoft qui lui je pense qu'il se base sur le Sendmessage()/SendInput(), et ceci fonctionne bien (TAB, SPACE, ENTER).

    Il y a surement encore une manière, mais je n'en vois pas d'autre que SendInput()


    Microsf01 Favier Sébastien 01

    mardi 26 mai 2015 15:41
  • Problème résolu, il fallait juste lancer mon application en mode administrateur.

    Une autre question me vient, comment fait-on pour appeler automatiquement l'uac afin d'avoir une élévation des privilèges pour mon application ? (Avec l'accord de l'utilisateur)

    Cordialement


    Microsf01 Favier Sébastien 01

    mardi 26 mai 2015 16:30
  • Je pense que le plus simple est de configurer dans le manifeste de l'application en jouant sur la valeur de "requestedExecutionLevel".

    Paul Bacelar, Ex - MVP VC++

    mercredi 27 mai 2015 07:22
    Modérateur
  • Merci pour votre réponse, étant pas dans le bon forum pour vous poser cette question je tente tout de même, ce "manifest" serai compatible avec le compilateur GCC ? Çà n'a pas l'aire d'être bien populaire :-/

    Et si je comprend, il faut placer ceci ?

    <security>
    <requestedPrivileges>
    <requestedExecutionLevel level="asInvoker" uiAccess="true"></requestedExecutionLevel>
    </requestedPrivileges>
    </security>

    Cordialement


    Microsf01 Favier Sébastien 01

    mercredi 27 mai 2015 16:38
  • Je n'ai jamais utiliser GCC pour faire des applications Windows.

    Mais en regardant les premières entrées, ça semble assez facilement utilisable, dans des cas bateau.

    Pour l'XML, bin presque, faut juste mettre

    level="requireAdministrator" uiAccess="false"


    http://stackoverflow.com/questions/2818179/how-to-force-my-net-app-to-run-as-administrator-on-windows-7


    Paul Bacelar, Ex - MVP VC++

    jeudi 28 mai 2015 16:44
    Modérateur
  • Bonjour, merci pour votre réponse, je vais donc essayer de "bidouiller" ceci.

    Merci pour votre aide Paul, bonne journée :-)

    Cordialement
    Sébastien FAVIER
    http://cpcdos.fr.nf/


    Microsf01 Favier Sébastien 01

    vendredi 29 mai 2015 07:11