AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht

SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht

Ein Thema von WladiD · begonnen am 1. Okt 2010 · letzter Beitrag vom 11. Sep 2020
Antwort Antwort
Seite 1 von 3  1 23   
WladiD
Registriert seit: 27. Jan 2006
Hallo DP-Mitglieder,

vor einigen Tagen bestand bei mir Bedarf, Tastatureingaben zu simulieren, wofür die Windows-Funktion MSDN-Library durchsuchenSendInput ja auch implementiert wurde. Doch das Array aufzubauen, welches die Funktion erwartet, ist ein Graus. So muss z.B. für jede Taste einmal der gedrückt und dann wieder der losgelassen Status einzeln angegeben werden. Es ist schon klar, dass es so sein soll, damit man die Kontrolle hat, aber es ist sehr mühsam und schreit geradezu nach einer Klasse die das ganze etwas vereinfacht.

Ich lege am einfachsten mit einem Beispiel los. Notepad starten:

Delphi-Quellcode:
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;
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.

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:

SendInputHelper auf GitHub

Dort ist auch ein umfangreicheres Beispiel (auch compiliert) dabei.

mfg

Geändert von WladiD (25. Jul 2019 um 12:23 Uhr) Grund: Repository umgezogen
 
Benutzerbild von mleyen
mleyen

 
FreePascal / Lazarus
 
#2
  Alt 1. Okt 2010, 09:14
Vielen Dank, Wladimir....
  Mit Zitat antworten Zitat
WladiD

 
Delphi 10.3 Rio
 
#3
  Alt 1. Okt 2010, 10:57
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:
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.
mfg
Angehängte Dateien
Dateityp: 7z WindowsFlip.7z (276,6 KB, 26x aufgerufen)
Waldemar Derr
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

 
Delphi 10.1 Berlin Professional
 
#4
  Alt 23. Nov 2010, 15:12
Gute Arbeit

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:
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;
P.S. ich hab hier WideChar genommen, damit es auch vor D2009 funzt.
Marco Warm

Geändert von MarcoWarm (23. Nov 2010 um 15:14 Uhr)
  Mit Zitat antworten Zitat
WladiD

 
Delphi 10.3 Rio
 
#5
  Alt 14. Dez 2010, 15:48
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.

Gute Arbeit

Als Dankeschön noch eine kleine Erweiterung...
Wow, Super, so wie es sich anhört kam meine Unit zum produktiven Einsatz. Freut mich!

Die Erweiterung werde ich gerne demnächst übernehmen. Vielen Dank dafür.
Waldemar Derr
  Mit Zitat antworten Zitat
WladiD

 
Delphi 10.3 Rio
 
#6
  Alt 14. Dez 2010, 23:15
Als Dankeschön noch eine kleine Erweiterung...
Hallo nochmals,

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 Projektseite eingespielt.
Waldemar Derr
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

 
Delphi 10.1 Berlin Professional
 
#7
  Alt 31. Jan 2011, 07:34
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 KEYEVENTF_UNICODE = 4; als konstante definieren würdest ... das bringt unsere alte Windows.pas nicht mit

Gruß
Marco
Marco Warm
  Mit Zitat antworten Zitat
WladiD

 
Delphi 10.3 Rio
 
#8
  Alt 31. Jan 2011, 09:16
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
Waldemar Derr
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

 
Delphi 10.1 Berlin Professional
 
#9
  Alt 1. Feb 2011, 13:50
vielen Dank
Marco Warm
  Mit Zitat antworten Zitat
PeterPanino

 
Delphi 10.4 Sydney
 
#10
  Alt 25. Okt 2012, 12:44
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:
IH.AddText('Das ist ein Test üöäÜÖÄß!"§$%&/()=?\|~', True);
IH.AddText('Привет! Cześć! 你好! !שלום', TRUE);
Wenn ich jedoch ein "é" senden möchte, so funktioniert es nicht:

IH.AddText('é', True); // Kleiner lateinischer Buchstabe E mit Akut

Wie kann ich dieses Zeichen senden?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf