Eingegebenen Text wiederholt schreiben lassen

  • Themenstarter Themenstarter Gelöschtes Mitglied 67123
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 67123

Gast
Robot ist mir bekannt, aber ich habe vor, dass der eingegebene Text nicht Buchstabe für Buchstabe getippt wird, sondern sofort eingefügt wird. Auch fiele mir da Paste from Clipboard ein, aber gibt es auch eine andere Möglichkeit, das Problem zu lösen? Denn der Nachteil ist der, dass wenn man währenddessen etwas anderes kopiert, dass dann der neue Text o. Ä. aus der Zwischenablage eingefügt wird.

Wie folgt soll es nicht aussehen (Eingegebener Text = Test):
T
e
s
t
T
e
s
t

Wie folgt soll es aussehen:
Test
Test

Danke!
 
Dem TE geht es um die Steuerung anderer Applikationen aus einer Java Anwendung heraus - so habe ich zumindest seine früheren Threads in Erinnerung.

Auch fiele mir da Paste from Clipboard ein, aber gibt es auch eine andere Möglichkeit, das Problem zu lösen? Denn der Nachteil ist der, dass wenn man währenddessen etwas anderes kopiert, dass dann der neue Text o. Ä. aus der Zwischenablage eingefügt wird.
Generell ist es sehr schlecht, wenn neben einem Robot auch noch ein User gleichzeitig an einem Rechner arbeitet. Das schreit so oder so nach Problemen.

Aber das Problem mit der Zwischenablage lässt sich sehr gut minimieren:
  • Du musst die ursprüngliche Zwischenablage erst einmal sichern.
  • Dann setzt Du die Zwischenablage und fügst die ein, wo Du das möchtst.
  • Dann setzt Du die Zwischenablage wieder zurück
Das geht so fix, dass die Wahrscheinlichkeit von Kollisionen nicht zu hoch ist. (Hängt natürlich auch davon ab wie oft das gemacht wird bzw. wie aktiv der User ist.)

Die direkte Steuerung einer Applikation geht aber auch. Das habe ich in der Vergangenheit schon gemacht, aber mit C# und nicht mit Java (und das war schon heftig genug. Da kommen dann auch so Spielereien wie Speicherschutz bei Prozessen ins Spiel!).

Da müsste man also schauen, was Du genau machen willst. Welche Applikation willst Du steuern? Ganz universell geht das nicht.

Wenn es eine native Applikation unter Windows ist, dann könnte man schauen, was man für Nachrichten an die Fenster schicken kann. Einfache Dinge gehen bestimmt per JNI - also Fenster finden und so.

Wenn es eine Web-Applikation ist, dann wäre ggf. denkbar, das innerhalb der Java Anwendung laufen zu lassen. Dann wäre es ggf. möglich, hier eigene JavaScripts laufen zu lassen, die die Modifikationen für Dich machen. Oder wenn es im Browser sein muss, dann könnte man schauen, ob man da mit UserScripts eine Schnittstelle schaffen kann. (Das wäre aber dann halt im Prinzip eine JavaScript Lösung und keine Java Lösung.)
 
Dem TE geht es um die Steuerung anderer Applikationen aus einer Java Anwendung heraus - so habe ich zumindest seine früheren Threads in Erinnerung.


Generell ist es sehr schlecht, wenn neben einem Robot auch noch ein User gleichzeitig an einem Rechner arbeitet. Das schreit so oder so nach Problemen.

Aber das Problem mit der Zwischenablage lässt sich sehr gut minimieren:
  • Du musst die ursprüngliche Zwischenablage erst einmal sichern.
  • Dann setzt Du die Zwischenablage und fügst die ein, wo Du das möchtst.
  • Dann setzt Du die Zwischenablage wieder zurück
Das geht so fix, dass die Wahrscheinlichkeit von Kollisionen nicht zu hoch ist. (Hängt natürlich auch davon ab wie oft das gemacht wird bzw. wie aktiv der User ist.)

Die direkte Steuerung einer Applikation geht aber auch. Das habe ich in der Vergangenheit schon gemacht, aber mit C# und nicht mit Java (und das war schon heftig genug. Da kommen dann auch so Spielereien wie Speicherschutz bei Prozessen ins Spiel!).

Da müsste man also schauen, was Du genau machen willst. Welche Applikation willst Du steuern? Ganz universell geht das nicht.

Wenn es eine native Applikation unter Windows ist, dann könnte man schauen, was man für Nachrichten an die Fenster schicken kann. Einfache Dinge gehen bestimmt per JNI - also Fenster finden und so.

Wenn es eine Web-Applikation ist, dann wäre ggf. denkbar, das innerhalb der Java Anwendung laufen zu lassen. Dann wäre es ggf. möglich, hier eigene JavaScripts laufen zu lassen, die die Modifikationen für Dich machen. Oder wenn es im Browser sein muss, dann könnte man schauen, ob man da mit UserScripts eine Schnittstelle schaffen kann. (Das wäre aber dann halt im Prinzip eine JavaScript Lösung und keine Java Lösung.)
Dann wird mich das hier wahrscheinlich nicht wirklich zum Ziel bringen (oder?). Wenn die Zwischenablage (wie bei KeePass[XC]) gesichert ist, wenn man die Log-in-Daten in die Zwischenablage kopieren lässt, muss ja was anderes geschehen, als dass der Text offensichtlich in der Zwischenablage abgelegt wird, doch ich weiß leider nicht, wie. Und soll das dann wirklich mit
Java:
robot.keyPress(VK_CONTROL);
robot.keyPress(VK_V);
eingefügt werden?
Und wie funktioniere das Zurücksetzen der Zwischenablage, ohne dass alle anderen kopierten Dinge verschwinden (ebenfalls wie bei KeePass[XC])?
 
Ich habe gerade Probleme, dich zu verstehen. Was ist genau Dein Problem?

Der Link von Dir zeigt ja erst einmal, wie man etwas in die Zwischenablage packen kann. Das ist ja ein Teil von dem, was Du brauchst.

Was meinst Du mit "Zwischenablage gesichert"? Ich habe keine Ahnung, was da KeePass machen könnte, auf das Du anspielst. Meines Wissens wird da die Zwischenablage einfach gesetzt ... es läuft maximal ein Timer, so dass die Zwischenablage nach kurzer Zeit erneut gesetzt wird, so dass das Passwort da nur kurze Zeit in der Zwischenablage ist.

Das Sichern der vorherigen Zwischenablage dürfte einfach sein. Clipboard hat die Methode getContents. Das gibt dir den Inhalt oder null. Der Parameter wird nicht verwendet, so dass Du da einfach null angeben kannst.

Das Zurückschreiben geht mit setContents.
 
Ich habe gerade Probleme, dich zu verstehen. Was ist genau Dein Problem?

Der Link von Dir zeigt ja erst einmal, wie man etwas in die Zwischenablage packen kann. Das ist ja ein Teil von dem, was Du brauchst.

Was meinst Du mit "Zwischenablage gesichert"? Ich habe keine Ahnung, was da KeePass machen könnte, auf das Du anspielst. Meines Wissens wird da die Zwischenablage einfach gesetzt ... es läuft maximal ein Timer, so dass die Zwischenablage nach kurzer Zeit erneut gesetzt wird, so dass das Passwort da nur kurze Zeit in der Zwischenablage ist.

Das Sichern der vorherigen Zwischenablage dürfte einfach sein. Clipboard hat die Methode getContents. Das gibt dir den Inhalt oder null. Der Parameter wird nicht verwendet, so dass Du da einfach null angeben kannst.

Das Zurückschreiben geht mit setContents.
Mit Clipboard.getSystemClipboard().clear(); bzw. .setContent(null); setze ich die Zwischenablage zurück. Der Verlauf wird ja nicht dadurch geleert.
Eigentlich hatte ich vor, dass der Text in die Zwischenablage kopiert wird, ohne dass es im Verlauf mit drin steht, so wie bei KeePass[XC].

  • Du musst die ursprüngliche Zwischenablage erst einmal sichern.
Was passiert denn, wenn ich das mache und wie mache ich das?
 
Ok, ich habe jetzt einmal recherchiert, was Du meintest: Windows hat eine History vom Clipboard. Das wird von Java selbst so aber nicht unterstützt und daher hast Du rein aus Java da erst einmal keinen Zugriff drauf.

Und selbst unter Windows scheint es dafür keine win32 API für zu geben. In UWP Libraries gibt es da wohl Möglichkeiten.

Daher ist das etwas, bei dem ich erst einmal nicht helfen kann. Evtl. kann man schauen, wie das KeePass macht um dann den Part per JNI zugreifbar zu machen. Aber so aus Java sehe zumindest ich keine einfache Möglichkeit.
 
keepass macht das auf zwei wege
1. setz clipboard auf passwort
2. setz clipboard auf "" nach 12 sekunden
wenn du die windows clipboard historie hast dann wird das passwort auch da permanent gespeichert von keepass also das hat das gleiche problem

die zweite methode die keepass nutzt ist mit obfuscation
das ist auch erklärt wie das funktioniert
 
Ok, ich habe jetzt einmal recherchiert, was Du meintest: Windows hat eine History vom Clipboard. Das wird von Java selbst so aber nicht unterstützt und daher hast Du rein aus Java da erst einmal keinen Zugriff drauf.

Und selbst unter Windows scheint es dafür keine win32 API für zu geben. In UWP Libraries gibt es da wohl Möglichkeiten.

Daher ist das etwas, bei dem ich erst einmal nicht helfen kann. Evtl. kann man schauen, wie das KeePass macht um dann den Part per JNI zugreifbar zu machen. Aber so aus Java sehe zumindest ich keine einfache Möglichkeit.
Ich habe einfach mal nur weitergemacht und gemerkt, dass durch das Programm während des Ablaufs nichts im Verlauf der Zwischenablage gespeichert wird und am Ende immer noch der letzte Wert des Verlaufs verwendet werden kann. Das Programm hat quasi seine eigene Zwischenablage. Ich kann nämlich währenddessen mit Strg + V den letzten Wert des Verlaufs einfügen, aber es behindert nicht das Programm, das hat weiterhin seine "eigene" Zwischenablage. 🤔
Folgender Code wird nur 1-mal vor dem Programmstart ausgeführt:
Java:
            Platform.runLater(() -> {
                Clipboard.getSystemClipboard().clear();
                Clipboard.getSystemClipboard().setContent(inputClipboardContent);
            });
 

Neue Themen


Zurück
Oben