2016-04-18 10 views
0

Ich habe das folgende Szenario: Delphi XE7 und eine Android-Emulator-Umgebung (Andy). Ich verwende den folgenden Befehl Einfügen von Text in Windows-Umgebung korrekt zu bedienen:Kopieren und Einfügen Delphi für Android

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); 
    keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0); 
    keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0); 
    keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0) 
end; 

Die Formstyle Option Form ist auf fsStayOnTop.
Jetzt mit dem Android-Emulator muss ich den Text zum Beispiel in der Google-Suchleiste im Emulator einfügen und der Befehl Einfügen funktioniert nicht.

Ich bemerkte, dass, wenn ich die rechte Maustaste für 2 Sekunden halte, erscheint die Paste-Option (Android-Umgebung) und durch Klicken darauf kann ich einfügen, aber ich brauche es automatisch zu sein. Irgendein Vorschlag ?

+0

Halten Sie die rechte Maustaste 2 Sekunden lang gedrückt und klicken Sie auf die Schaltfläche Einfügen. Wenn Sie dies durch Eingabe von Fälschungen tun, müssen Sie dies tun. –

Antwort

0

Die Tastatureingabe wird vom Vordergrundfenster verarbeitet. Sie injizieren Tastatureingaben in die gleiche Low-Level-Eingabewarteschlange, an die die Tastatur selbst Benutzereingaben sendet (BTW, Sie sollten SendInput() statt keybd_event() verwenden). Ihre simulierten Tastenanschläge durchlaufen die gleiche Verarbeitung und das gleiche Routing, das von den Benutzern eingegebene Tastenanschläge durchlaufen. Raymond Chen hat eine schöne Beschreibung zu diesem Thema auf seiner Website:

When something gets added to a queue, it takes time for it to come out the front of the queue

Wenn Sie auf Ihrer Schaltfläche klicken, wird die App-Fenster im Vordergrund. Somit wird Ihre Ctrl-V Sequenz von Ihrer App empfangen, nicht vom Andy Emulator. Und wenn Sie eine TWinControl-abgeleitete Schaltfläche verwenden, wie TButton, erfordert es Eingabefokus beim Klicken (um dies zu vermeiden, verwenden Sie stattdessen eine TGraphicControl-abgeleitete Schaltfläche, wie TSpeedButton). Da ein Bearbeitungssteuerelement nicht fokussiert ist, scheint Ctrl-V nichts zu tun, da nichts eingefügt werden muss, wenn die Keystokes verarbeitet werden.

Sie müssen SetForegroundWindow() verwenden (und vielleicht auch SetFocus()) Andys Fenster wieder in den Vordergrund zu bringen und geben ihm den Eingabefokus vor Sie dann Ihre Tastatureingaben senden.

Auch dann gibt es keine 100% Garantie, dass einige andere App Fokus nicht zwischen der Zeit, die Sie die Tastenanschläge erteilen und Zeit, die sie aus der Eingabewarteschlange kommen stehlen können.

+0

Strg + V ist in Android bedeutungslos. Der Fragesteller möchte, dass die Paste in der Android App passiert. –

+0

@DavidHeffernan: Zugegeben, Android selbst erkennt Ctrl-V nicht, aber die Frage betrifft einen Android-Emulator, der unter Windows läuft, also der Emulator selbst nicht mit Strg-V umgehen und Text von der Windows-Zwischenablage auf Android kopieren kann Zwischenablage und fügen Sie es in das aktuelle Android UI-Steuerelement ein? Ich habe schon einmal versucht, Andy zu verwenden und hatte nur Probleme damit (es würde nie richtig starten), also weiß ich nicht, welche Art von Cross-Interaktionsfunktionalität tatsächlich auf der Emulatorebene an der Plattformgrenze funktioniert. –

+0

Vielleicht könnte der Fragesteller diesen Punkt für uns klären –