In den Tastaturpuffer schreiben

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
NoCee
Beiträge: 122
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2 (L 1.8.0 FPC 3.0.4 )
CPU-Target: 32/64Bit
Wohnort: Ulm

In den Tastaturpuffer schreiben

Beitrag von NoCee »

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

mschnell
Beiträge: 3411
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

Beitrag von mschnell »

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

Warf
Beiträge: 1505
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: In den Tastaturpuffer schreiben

Beitrag von Warf »

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

Socke
Lazarusforum e. V.
Beiträge: 2814
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

Beitrag von Socke »

NoCee hat geschrieben:
Mi 5. Aug 2020, 11:09
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.
Für Windows: schau dir mal Raw Input an.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

NoCee
Beiträge: 122
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2 (L 1.8.0 FPC 3.0.4 )
CPU-Target: 32/64Bit
Wohnort: Ulm

Re: In den Tastaturpuffer schreiben

Beitrag von NoCee »

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.

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;
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

wp_xyz
Beiträge: 3359
Registriert: Fr 8. Apr 2011, 09:01

Re: In den Tastaturpuffer schreiben

Beitrag von wp_xyz »

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':

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;  

Warf
Beiträge: 1505
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: MacOS | Win 10 | Linux
CPU-Target: x86_64
Wohnort: Aachen

Re: In den Tastaturpuffer schreiben

Beitrag von Warf »

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:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(Edit1.Handle, WM_SETTEXT, WPARAM(nil), LPARAM(PChar('Test')));
end;
Das ist praktisch das selbe wie

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := Test;
end;
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

Mathias
Beiträge: 5084
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: In den Tastaturpuffer schreiben

Beitrag von Mathias »

In den Tastaturpuffer schreiben
Konnte das nicht schon Win3.1 mit dem Makro-Recorder ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Antworten