![]() |
SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Hallo DP-Mitglieder,
vor einigen Tagen bestand bei mir Bedarf, Tastatureingaben zu simulieren, wofür die Windows-Funktion ![]() Ich lege am einfachsten mit einem Beispiel los. Notepad starten:
Delphi-Quellcode:
Jeder der mit SendInput schon mal gearbeitet hat, wird wissen, was das für eine Vereinfachung mit sich bringt. Desweiteren wird der Caps-Lock-Zustand in der Methode Flush neutralisiert, soll heißen, dass im obigen Beispiel auch wirklich 'cmd' und nicht 'CMD' gesendet wird, wenn der Benutzer die Feststelltaste (wohl aus versehen) aktiviert hat.
uses SendInputHelper;
with TSendInputHelper.Create do begin AddShortCut([ssWin], 'r'); // [Win] + [R] AddDelay(100); // Verzögerung in ms AddText('cmd', TRUE); // TRUE = AppendReturn Flush; // Erst hier werden die zuvor hinzugefügten // Eingaben gebündelt abgesetzt. Free; end; Ich weiß, es ist eigentlich kein "richtiges" Projekt, doch ich sehe es einfach mal als eines an und habe es auch bei sourceforge veröffentlicht: ![]() Dort ist auch ein umfangreicheres Beispiel (auch compiliert) dabei. mfg |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Vielen Dank, Wladimir....
|
Ein weiteres Beispiel
Liste der Anhänge anzeigen (Anzahl: 1)
Habe soeben ein minimalistisches Beispiel erstellt, mit dem das Windows Flip 3D aktiviert und für 2 Sekunden durch die geöffneten Fenster geflippt wird:
Delphi-Quellcode:
mfg
program WindowsFlip;
{$APPTYPE CONSOLE} uses SysUtils, Windows, SendInputHelper; var cc:Integer; begin with TSendInputHelper.Create do begin AddShift([ssWin], TRUE, FALSE); for cc:=1 to 20 do begin AddVirtualKey(VK_TAB, TRUE, FALSE); AddDelay(100); end; AddVirtualKey(VK_TAB, FALSE, TRUE); AddVirtualKey(VK_ESCAPE); AddShift([ssWin], FALSE, TRUE); Flush; Free; end; end. |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Gute Arbeit 8-)
Als Dankeschön noch eine kleine Erweiterung. zum Hintergrund: Die aktuelle Implementation kann nur Zeichen schicken, die es auch im aktuell eingestellten Keyboard Layout gibt. D.h. auf einem deutschen Keyboard kannst du kein الله أكبر ausgeben. Das ist uns aufgefallen, als ein TerminalDiensteClient mit englischem Tastaturlayout ein Ö schicken wollte. Mit der Erweiterung ist das kein Problem mehr. Ein nicht unicodefähiges Control erhält dann die Ansi Entsprechung des Zeichens. wie man die Klasse erweitern kann:
Delphi-Quellcode:
P.S. ich hab hier WideChar genommen, damit es auch vor D2009 funzt.
class function TSendInputHelper.GetUnicode(SendChar: WideChar; Press,
Release: Boolean): TInputArray; const KEYEVENTF_UNICODE = 4; var ScanCode:Word absolute SendChar; KeyDown, KeyUp:TInput; begin KeyDown.Itype:=INPUT_KEYBOARD; KeyDown.ki.wVk:=0; KeyDown.ki.wScan:=ScanCode; KeyDown.ki.dwFlags:=KEYEVENTF_UNICODE; KeyDown.ki.time:=0; KeyDown.ki.dwExtraInfo:=GetMessageExtraInfo; KeyUp:=KeyDown; KeyUp.ki.dwFlags:=KeyUp.ki.dwFlags or KEYEVENTF_KEYUP; SetLength(Result, 0); if Press and Release then begin SetLength(Result, 2); Result[0]:=KeyDown; Result[1]:=KeyUp; end else if Press then begin SetLength(Result, 1); Result[0]:=KeyDown; end else if Release then begin SetLength(Result, 1); Result[0]:=KeyUp; end; end; procedure TSendInputHelper.AddUnicodeChar(SendChar: WideChar; Press, Release: Boolean); var Inputs:TInputArray; begin Inputs:=GetUnicode(SendChar, Press, Release); if Assigned(Inputs) then AddRange(Inputs); end; |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Hallo MarcoWarm,
sorry, dass ich erst jetzt antworte. Das Forum hat mir keine Benachrichtigung geschickt, dass ich ein Antwort erhalten hab. Hab es nur per Zufall entdeckt. Zitat:
Die Erweiterung werde ich gerne demnächst übernehmen. Vielen Dank dafür. |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Zitat:
deinen Code habe ich als Basis genommen und den Support für Unicode eingebunden. Es läuft jetzt transparent ab, die Klassenmethode TSendInputHelper.GetChar überprüft nun ob das Zeichen ein Unicode-Char ist und leitet den Aufruf ggf. auf TSendInputHelper.GetUnicodeChar um. Dadurch werden alle Methoden, die auf GetChar basieren, automatisch Unicode kompatibel und eine separate AddUnicode Methode wird überflüssig. Ich weiß, dadurch bin ich nicht Abwärtskompatibel zu < Delphi 2009, aber das interessiert mich ehrlich gesagt nicht ;) (think only forward) Die Änderungen sind auf der ![]() |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Hi Wladi,
danke für's einbauen (wir haben es erstmal ungetestet in unsere produktive Umgebung übernommen ;-) ein kleiner Hinweis noch. Für alle D2009 Nutzer wäre es schön, wenn du
Delphi-Quellcode:
als konstante definieren würdest ... das bringt unsere alte Windows.pas nicht mit :-(
KEYEVENTF_UNICODE = 4;
Gruß Marco |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Hi Marco,
die Konstante ist drin. Die Änderung wurde ins SVN-Repository gecommitted. Leider kann ich im Moment keine Dateien releasen, da sourceforge vor ein paar Tagen gehackt wurde und der File-Release-Dienst deaktiviert wurde. Hole ich aber in ein paar Tagen nach. mfg |
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
vielen Dank :-D
|
AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
Hallo Waldemar,
vielen Dank für TSendInputHelper! Ich habe eine Frage: Man kann zwar alle möglichen Schriftzeichen senden, die nicht auf der Tastatur vorhanden sind, z.B.:
Delphi-Quellcode:
Wenn ich jedoch ein "é" senden möchte, so funktioniert es nicht:
IH.AddText('Das ist ein Test üöäÜÖÄß!"§$%&/()=?\|~', True);
IH.AddText('Привет! Cześć! 你好! !שלום', TRUE);
Delphi-Quellcode:
IH.AddText('é', True); // Kleiner lateinischer Buchstabe E mit Akut
Wie kann ich dieses Zeichen senden? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz