In den Tastaturpuffer schreiben
-
- Beiträge: 174
- Registriert: Do 3. Mär 2011, 21:34
- OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
- CPU-Target: Intel 32/64Bit, ARM9
- Wohnort: Ulm
In den Tastaturpuffer schreiben
Hallo zusammen,
ich muß eine Paletten Nummer in eine Fremdsoftware bekommen.
Ein Barcodescanner ließt diese und schickt sie mir übers Netzwerk auf den entsprechenden Rechner.
Da läuft meine und die Fremdsoftware drauf. Mein jetziger Trick ist der Umweg über einen Arduino.
Per Com an den Arduino und per USB-Tastaturtreiber wieder zurück in die Fremdsoftware.
Bei der ist der Focus permanent auf einem Eingabefeld. Mit dem Rechner wird sonst nichts anderes gemacht.
Funktioniert soweit einwandfrei. Aber das muß doch auch anders gehen.
Wie bekomme ich irgendwelche Daten in den Tastaturpuffer?
Die andere Richtung wäre auch interessant. Wie kann ich den Tastaturpuffer auslesen ohne daß meine Software den Focus hat?
Damit wollen wir für Statistikzwecke mit loggen wenn bei der Fremdsoftware die Daten von Hand eingegeben werden.
Vielen Dank im Voraus
Gruß
NoCee
ich muß eine Paletten Nummer in eine Fremdsoftware bekommen.
Ein Barcodescanner ließt diese und schickt sie mir übers Netzwerk auf den entsprechenden Rechner.
Da läuft meine und die Fremdsoftware drauf. Mein jetziger Trick ist der Umweg über einen Arduino.
Per Com an den Arduino und per USB-Tastaturtreiber wieder zurück in die Fremdsoftware.
Bei der ist der Focus permanent auf einem Eingabefeld. Mit dem Rechner wird sonst nichts anderes gemacht.
Funktioniert soweit einwandfrei. Aber das muß doch auch anders gehen.
Wie bekomme ich irgendwelche Daten in den Tastaturpuffer?
Die andere Richtung wäre auch interessant. Wie kann ich den Tastaturpuffer auslesen ohne daß meine Software den Focus hat?
Damit wollen wir für Statistikzwecke mit loggen wenn bei der Fremdsoftware die Daten von Hand eingegeben werden.
Vielen Dank im Voraus
Gruß
NoCee
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: In den Tastaturpuffer schreiben
Ich weiß zwar nicht wie, aber dass es geht ist keine Frage,. Es gibt diverse Programme mit denen man vorgefertigte Folgen an die Tastatur-Simulation schicken kann. Meist kann man auch Fenster anwählen, Fensterinhalt auswerten etc. Es gibt sogar Programme, die das z.B, per Midi-Steuerung machen z.B. -> https://www.bome.com/products/miditranslator ("Use this outgoing action to emulate keystrokes of your QWERTY keyboard. For example, control other applications with shortcuts.", "On Windows, you can inject keystrokes directly into some applications, even if they're not the currently active application.", "Emulate typing text on your QWERTY keyboard (rather than only emulate keystrokes)"). Diese Software kann übrigens nicht nur von Midi sondern auch über den Serienport gesteuert werden ("Trigger actions from received bytes or text on a serial port.").
-Michael
-Michael
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: In den Tastaturpuffer schreiben
Windows, Linux oder Mac?
Unter windows geht das ganz einfach über SendMessage, da kannst du den text sogar direkt an die Textbox in die es soll senden. Unter Linux musst du das ganze über den X-Server regeln, also via xlib. Unter macOS geht das ganze auch irgendwie über cocoa, da weiß ich aber nicht wie.
Ein cross plattform Lazarus lösung gibts nicht
Unter windows geht das ganz einfach über SendMessage, da kannst du den text sogar direkt an die Textbox in die es soll senden. Unter Linux musst du das ganze über den X-Server regeln, also via xlib. Unter macOS geht das ganze auch irgendwie über cocoa, da weiß ich aber nicht wie.
Ein cross plattform Lazarus lösung gibts nicht
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: In den Tastaturpuffer schreiben
Für Windows: schau dir mal Raw Input an.NoCee hat geschrieben: Mi 5. Aug 2020, 11:09Die andere Richtung wäre auch interessant. Wie kann ich den Tastaturpuffer auslesen ohne daß meine Software den Focus hat?
Damit wollen wir für Statistikzwecke mit loggen wenn bei der Fremdsoftware die Daten von Hand eingegeben werden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 174
- Registriert: Do 3. Mär 2011, 21:34
- OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
- CPU-Target: Intel 32/64Bit, ARM9
- Wohnort: Ulm
Re: In den Tastaturpuffer schreiben
Hallo,
das soll momentan nur auf Windows laufen.
Fremdsoftware möchte ich nicht einsetzen, da kann ich gleich den Arduino dran lassen.
Ich hab das mal nach dieser Seite probiert.
http://www.tech-ecke.de/index_quereinst ... lieren.htm
Das tut schon mal das was ich momentan sofort brauche. Damit kann ich schon mal weitermachen.
SendMessage und Raw Input muß ich mir noch genauer anschauen, beim Überfliegen hab ich das noch nicht kapiert.
Danke für eure Hilfe
Gruß
NoCee
das soll momentan nur auf Windows laufen.
Fremdsoftware möchte ich nicht einsetzen, da kann ich gleich den Arduino dran lassen.
Ich hab das mal nach dieser Seite probiert.
http://www.tech-ecke.de/index_quereinst ... lieren.htm
Das tut schon mal das was ich momentan sofort brauche. Damit kann ich schon mal weitermachen.
Code: Alles auswählen
procedure EnterText(AText: String);
var lCount : Integer;
lScanCode : Smallint;
lWithAlt,
lWithCtrl,
lWithShift : Boolean;
begin
for lCount := 1 To Length(AText) Do
begin
lScanCode :=VkKeyScan(AText[lCount]);
keybd_event(lScanCode, 0, 0, 0);
keybd_event(lScanCode, 0, KEYEVENTF_KEYUP, 0);
end;
//keybd_event(13, 0, 0, 0); // CR funktioniert
//keybd_event(10, 0, 0, 0); // LF funktioniert
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
EnterText('MyText1');
EnterText('MyText2'+#10#13); // geht auch mit CR+LF
EnterText('My Text3'); // auch mit blanks
Timer1.Enabled:=false;
end;
Danke für eure Hilfe
Gruß
NoCee
Re: In den Tastaturpuffer schreiben
Versuch's mal mit "MouseAndKeyInput" im Ordner "Components" der Lazarus-Installation (https://wiki.freepascal.org/MouseAndKeyInput). Das Demo-Programm manipuliert zwar nur das eigene Formular, aber eigentlich müsste das auch mit einer fremden Anwendung funktionieren.
[EDIT]
Der folgende Code schreibt z.B. in ein NotePad-Fenster ein 'a':
[EDIT]
Der folgende Code schreibt z.B. in ein NotePad-Fenster ein 'a':
Code: Alles auswählen
uses
Windows, MouseAndKeyInput, LCLType;
procedure TForm1.Button5Click(Sender: TObject);
var
h: HWND;
begin
h := FindWindow(nil, 'Unbenannt - Editor');
if h <> 0 then
begin
ShowWindow(h, SW_SHOW);
BringWindowToTop(h);
Application.ProcessMessages;
KeyInput.Press(VK_A);
end;
end;
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: In den Tastaturpuffer schreiben
Mit keybd_event spielst du dumme Tastatur. Das hat seine vorteile, z.b. um Hotkeys zu simulieren, für das was du vorhast ist es denk ich allerdings ein bisschen ungeeignet, denn wo die tasten ankommen ist das aktuell ausgewählte Fenster, und das muss nicht unbedingt das gewünschte Ziel sein. Als beispiel, demletzt hat mein Passwort Manager ausversehen eins meiner Passwörter in einen Gruppenchat gepasted statt in die richtige anwendung, weil durch eine eingehende nachricht der chat plötzlich fokus hatte.
Mit SendMessage kannst du hingegen direkt mit einem Control reden indem du direkt nachrichten in dessen Message Queue schreibst. Beispiel:
Das ist praktisch das selbe wie
Nur halt statt über die LCL, low level über die WInAPI. Das funktioniert also immer, egal welches element grad ausgewählt ist, ob das fenster sichtbar oder minimiert ist, whatever. Das wichtige ist nur das du irgendwie an die Handle kommst. Innerhalb der eigenen LCL anwendung kann man zwar .Handle benutzen, aber in um das handle einer fremden anwendung zu bekommen musst du natürlich ein bisschen mehr machen.
In der WinAPI haben controls eine controlID, die ist immer gleich. Via GetDlgItem kannst du dann mittels des handles vom Fenster, das handle vom Control bekommen. Das Fenster Handle kannst du entweder über das Handle vom Prozess bekommen oder über den Fenstertitel über FindWindow(A/W)
Gibt genug beispiele dafür im Internet einfach mal ein bisschen googlen.
Um an die Control informationen (ID, etc) ranzukommen kannst du das microsoft tool inspect benutzen: https://docs.microsoft.com/en-us/window ... ct-objects
Mit SendMessage kannst du hingegen direkt mit einem Control reden indem du direkt nachrichten in dessen Message Queue schreibst. Beispiel:
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(Edit1.Handle, WM_SETTEXT, WPARAM(nil), LPARAM(PChar('Test')));
end;
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := Test;
end;
In der WinAPI haben controls eine controlID, die ist immer gleich. Via GetDlgItem kannst du dann mittels des handles vom Fenster, das handle vom Control bekommen. Das Fenster Handle kannst du entweder über das Handle vom Prozess bekommen oder über den Fenstertitel über FindWindow(A/W)
Gibt genug beispiele dafür im Internet einfach mal ein bisschen googlen.
Um an die Control informationen (ID, etc) ranzukommen kannst du das microsoft tool inspect benutzen: https://docs.microsoft.com/en-us/window ... ct-objects
-
- Beiträge: 6914
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: In den Tastaturpuffer schreiben
Konnte das nicht schon Win3.1 mit dem Makro-Recorder ?In den Tastaturpuffer schreiben
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot