Question

j'essaie d'envoyer de fausses entrées au clavier à une application qui s'exécute dans une session de bureau à distance. J'utilise:

Byte key = Ord("A");

keybd_event(key, 0, 0, 0); // key goes down
keybd_event(key, 0, KEYEVENTF_KEYUP, 0); // key goes up

Maintenant, ce code envoie le caractère " un " à une fenêtre locale, mais il n'enverra pas à la fenêtre du bureau distant.

Cela signifie que j'utilise Remote Desktop pour se connecter à un serveur, puis que j'ouvre le Bloc-notes sur ce serveur. Si je frappe manuellement les touches du clavier: elles apparaissent dans la fenêtre d'édition de Notepad. Mais la fausse entrée au clavier de keybd_event ne provoque pas l’affichage du "a" dans le bloc-notes.

Comment puis-je envoyer par programmation une fausse saisie au clavier à une application exécutée dans une connexion de bureau à distance, à partir d’une application exécutée sur la machine locale?

Le coin Nitpickers

Dans ce cas particulier, je souhaite procéder car j’essaie de vaincre un délai d’inactivité. Mais je pourrais tout aussi bien essayer de

  • effectuer des tests d'automatisation de l'interface utilisateur
  • Tests de stress de l'interface utilisateur
  • Tests de recherche de pannes de l'interface utilisateur
  • Tests unitaires de l'interface utilisateur
  • Tests de saisie de données d'interface utilisateur
  • tests de peinture d'interface utilisateur
  • ou tests de résilience de l'interface utilisateur.

En d'autres termes, mes raisons de le vouloir ne sont pas importantes

Remarque: le délai d'attente peut être dû à l'inactivité du bureau distant, ou peut-être pas. Je ne sais pas, et cela n’affecte pas ma question.

Était-ce utile?

La solution

Répondre

Bien que Microsft indique que vous n’avez pas besoin de le faire, , vous ne devez pas , envoyez le code OEM, vous devez envoyer les codes de balayage OEM. Dans cet exemple, je dois envoyer les codes de numérisation OEM pour

  • la touche A descend
  • la touche A monte

Il existe une image d'un graphique répertorié par CodeProject . les codes de lecture et de rupture des différentes clés:

alt text

Dans mon cas, les appels d'origine à keybd_event doivent être remplacés par:

Byte key = Ord("A");

keybd_event(key, 0x1E, 0, 0); // key goes down
keybd_event(key, 0x9E, KEYEVENTF_KEYUP, 0); // key goes up

J'ai testé cela et ça marche. Donc tout va bien.

Autres conseils

Peut-être pouvez-vous exécuter un script autoit avec PsExec , un remplacement léger de telnet qui vous permet d'exécuter des processus sur d'autres systèmes, avec une interactivité totale pour les applications console, sans avoir à installer manuellement le logiciel client.

(AutoIt est tout à fait capable d'envoyer n'importe quel signal (touches ou autre) à n'importe quelle application de fenêtre et peut être lancé avec PsExec sur le bureau distant)

Un script AutoIt tel que KillSaver , par exemple, est conçu pour déplacer la souris afin d’éviter tout temps d’inactivité prolongé sur un ordinateur!

Cela a très bien fonctionné, merci. Pour obtenir le code de numérisation du clavier, on peut utiliser:

int scan;
scan = MapVirtualKey(key & 0xff, 0);
keybd_event(key, scan, 0, 0); // key goes down
keybd_event(key, scan | 0x80, KEYEVENTF_KEYUP, 0); // key goes up

Vous pouvez utiliser SendMessage (); C'est vraiment un meilleur simulateur pour les clés. Eh bien, bonne chance à ce sujet!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top