Alternative à SendKeys lors de l'exécution sur un bureau distant?

j'ai une application qui injecte des touches dans des applications via SendKeys.

malheureusement, l'application ne fonctionnera pas quand je l'exécute via un bureau distant en raison du problème bien connu que SendKeys ne fonctionne pas avec le bureau distant.

quelqu'un A résolu ce problème avant, ou avez des suggestions sur la façon de le résoudre?

22
demandé sur Cody Gray 2009-07-16 20:00:15

4 réponses

SendKeys n'est pas un bon ajustement principalement en raison de:

  • il peut seulement envoyer des clés à l'application active/focalisée, qui n'est jamais garanti de fonctionner parce que l'application active peut changer entre le moment où les clés sont effectivement envoyés.
  • RDP et beaucoup d'autres bibliothèques (par exemple, DirectX) les bloquent principalement pour des raisons de sécurité.

meilleures alternatives:

exemple de code utilisant SendMessage :

HWND hwndNotepad = FindWindow(_T("Notepad"), NULL);
HWND hwndEdit = FindWindowEx(hwndNotepad, NULL, _T("Edit"), NULL);
SendMessage(hwndEdit, WM_SETTEXT, NULL, (LPARAM)_T("hello"));
8
répondu Mrchief 2017-05-23 11:46:17

vous pouvez contourner le problème RDP en ayant le bureau toujours ouvert une session avant l'utilisation (ou configuré pour auto-login @ chaque démarrage).

et même avec l'auto-login, si vous avez besoin d'un accès Bureau à distance pour exécuter l'automatisation, ou gérer le système, etc., la méthode préférée est d'utiliser VNC pour l'accès à distance plutôt que RDP. La raison est que VNC est multiplateformes et vous ne tomberez pas dans ce problème de RDP. VNC fonctionne comme un relais de votre bureau réel (RDP console session 0 ou la "tête" de la machine), l'inconvénient étant une session à distance à la fois seulement (ou vous partagez tous le même bureau + clavier + souris). VNC travaillera aussi pour les machines virtuelles. Utilisez VNC au lieu de L'accès RDP ou local (RDP) à partir du logiciel (VMWare/Hyper-V/Xen) virtual machine manager.

la seule chose à surveiller avec VNC encore est que le bureau ne soit pas configuré pour Auto-lock sur idle ou screensaver, qui peut également arrêter d'envoyer des clés et GUI automation de l'exécution, donc être sûr pour les désactiver. Screensaver et enregistrer la puissance de moniteur sauve est ok, juste aucun auto-lock et mot de passe protègent.

NOTE: Je ne suis pas sûr, mais crois que puisque VNC relaie le bureau "tel quel", c'est la même chose que l'exécution locale du point de vue de l'application/système, donc il devrait en théorie être capable de tromper le système/l'application qui n'autorise pas SendKeys via RDP. Je n'ai eu aucun problème à utiliser cette méthode VNC pour AutoIt + SendKeys, que j'aie été activement connecté via VNC ou déconnecté (sendkeys / automation continue de fonctionner après déconnexion parce que sur le bureau actuel, il est toujours connecté, juste que la VNC n'est pas active).

2
répondu David 2011-09-07 05:04:34

dans mon cas, J'utilisais avec succès le SendInput de WinAPI avec des codes de numérisation du matériel. Il semble que SendKeys mappe les caractères pour numériser les codes incorrectement.

2
répondu Vasily Nosov 2013-03-30 10:24:54

dans mon cas, j'utilisais sendkeys dans le cadre de l'automatisation des tests. Cela ne fonctionnerait pas à partir de ma machine de compilation, où l'agent de compilation utilise le protocole de bureau à distance. Je ne suis pas contente, mais j'ai pu sauter ce test dans le cadre de mes constructions automatisées.

utiliser des appels Win32 pour envoyer des messages de fenêtre pourrait fonctionner, si j'ai le temps, je pourrais essayer cela un jour.

de toute façon, voici le contrôle pour voir si le code courant est en cours d'exécution dans un bureau distant séance:

System.Environment.GetEnvironmentVariable("SESSIONNAME").StartsWith("RDP-")
1
répondu Frank Schwieterman 2011-08-29 16:31:36