Frage

Ich versuche, gefälschte Tastatureingabe an eine Anwendung zu senden, die in einer Remotedesktopsitzung ausgeführt wird. Ich verwende:

Byte key = Ord("A");

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

Nun hat dieser Code das Zeichen „a“ zu einem lokalen Fenster senden, aber es wird auf die Remote-Desktop-Fenster nicht senden.

Was das bedeutet, ist i Remote Desktop verwenden, um einen Server zu verbinden, und ich dann öffnen Notepad auf diesem Server. Wenn ich manuell Tasten auf der Tastatur stanzen: Sie erscheinen im Editor des Editor-Fenster. Aber keybd_event gefälschte Tastatureingabe nicht verursacht "a" 's in Notepad angezeigt werden.

Wie kann ich programtically gefälschte Tastatur sende Eingang an eine Anwendung in einer Remote-Desktop-Verbindung ausgeführt wird, von einer Anwendung auf dem lokalen Rechner ausgeführt wird?


Nitpicker Corner

In diesem speziellen Fall möchte ich, dies zu tun becase Ich versuche, ein Leerlauf-Timeout zu besiegen. Aber ich könnte genauso gut versuchen zu

  • durchführen UI Automation-Tests
  • UI-Stresstests
  • UI Fehlersuche Tests
  • UI Unit-Tests
  • UI Dateneingabetests
  • UI Farbe Tests
  • oder UI resiliance Tests.

Mit anderen Worten, meine Gründe für den Wunsch, es sind nicht wichtig

Hinweis: Der Timeout von Remote-Desktop-Inaktivität sein kann, oder vielleicht auch nicht. Ich weiß nicht, und es ist nicht meine Frage betreffen.

War es hilfreich?

Lösung

Antwort

Obwohl Microsft sagt, Sie brauchen nicht zu, und Sie sollten nicht , den OEM-Code senden, müssen Sie den OEM-Scan-Codes senden. In diesem Beispiel muß ich für den OEM-Scan-Codes senden

  • Taste A geht nach unten
  • Taste A geht nach oben

Es gibt eine Bild eines Diagramms auf Codeproject rel="nofollow , die Listen die Marke und die Scan-Codes für verschiedene Tasten brechen:

alt text

In meinem Fall die Original-Anrufe keybd_event geändert werden müssen, um:

Byte key = Ord("A");

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

Getestet habe ich diese, und es funktioniert. Also alles in Ordnung ist.

Andere Tipps

Mai werden Sie ausführen können eine autoit Skript mit PsExec , ein leichtgewichtiges Telnet-Ersatz, die Sie Prozesse ausführen auf anderen lässt: Systeme, komplett mit voller Interaktivität für Konsolenanwendungen, ohne manuell Client-Software installieren zu müssen.

(AutoIt ist durchaus in der Lage jedes Signal (Schlüssel oder andere) zu jedem Fenster Anwendung zu senden, und könnte mit PsExec auf dem Remote-Desktop gestartet werden)

Ein AutoIt Skript wie KillSaver zum Beispiel ausgelegt ist die Maus zu bewegen jede verlängern Leerlaufzeit auf einem Computer zu vermeiden!

Das funktionierte sehr gut danke. Um die Tastatur-Scan-Code zu erhalten, ein verwenden können:

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

könnten Sie Sendmessage (); Es ist wirklich ein viel besserer Simulator für Schlüssel. Nun, viel Glück auf diesem!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top