Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht (https://www.delphipraxis.net/154931-sendinputhelper-ein-wrapper-der-den-umgang-mit-sendinput-vereinfacht.html)

WladiD 1. Okt 2010 08:11

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

mleyen 1. Okt 2010 08:14

AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
 
Vielen Dank, Wladimir....

WladiD 1. Okt 2010 09:57

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

MarcoWarm 23. Nov 2010 14:12

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

WladiD 14. Dez 2010 14:48

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:

Zitat von MarcoWarm (Beitrag 1063517)
Gute Arbeit 8-)

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.

WladiD 14. Dez 2010 22:15

AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
 
Zitat:

Zitat von MarcoWarm (Beitrag 1063517)
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.

MarcoWarm 31. Jan 2011 06:34

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:
KEYEVENTF_UNICODE = 4;
als konstante definieren würdest ... das bringt unsere alte Windows.pas nicht mit :-(

Gruß
Marco

WladiD 31. Jan 2011 08:16

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

MarcoWarm 1. Feb 2011 12:50

AW: SendInputHelper - Ein Wrapper, der den Umgang mit SendInput vereinfacht
 
vielen Dank :-D

PeterPanino 25. Okt 2012 11:44

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:
IH.AddText('Das ist ein Test üöäÜÖÄß!"§$%&/()=?\|~', True);
IH.AddText('&#1055;&#1088;&#1080;&#1074;&#1077;&#1090;! Cze&#347;&#263;! &#20320;&#22909;! !&#1513;&#1500;&#1493;&#1501;', TRUE);
Wenn ich jedoch ein "é" senden möchte, so funktioniert es nicht:

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 23:59 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz