simulierte Keystrokes an Fremdapplikation senden

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Cocky
Beiträge: 46
Registriert: Sa 15. Nov 2008, 13:17

simulierte Keystrokes an Fremdapplikation senden

Beitrag von Cocky »

Hi ihr :)

ich bräuchte ein Programm, das simulierte Tastendrücke periodisch an eine Fremdapplikation sendet. Muß nur unter Win funktionieren.

Hat jemand eine Idee ob es für derartige Vorhaben eine Unit bzw. Komponente gibt ? oder gibt es ein derartiges Programm vielleicht schon ?

Wäre für Empfehlungen seeeeehr dankbar ! :mrgreen:

Gruß Cocky

mschnell
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: simulierte Keystrokes an Fremdapplikation senden

Beitrag von mschnell »

Du musst mit einer passenden Windows API den Handle auf das Main-Window des Programms finden (z.B. suchen Anhand des Window-Titles) und dann mit SendMessage dahin eine Key-Message schicken. Mein Sohn hat sowas 'mal im Praktikum gemacht.

-Michael

Cocky
Beiträge: 46
Registriert: Sa 15. Nov 2008, 13:17

Re: simulierte Keystrokes an Fremdapplikation senden

Beitrag von Cocky »

Werd mir wohl mal wieder das Win API unters Kopfkissen legen müssen *schwitz* :shock:

Danke Dir recht herzlich für Deine Antwort !! :mrgreen:

Grüße Cocky

Cargo_03
Beiträge: 10
Registriert: Sa 8. Mai 2010, 14:42
OS, Lazarus, FPC: WIN 1.4.4 / 1.8.4
CPU-Target: 64 Bit

Re: simulierte Keystrokes an Fremdapplikation senden

Beitrag von Cargo_03 »

Cocky hat geschrieben:Hi ihr :)

ich bräuchte ein Programm, das simulierte Tastendrücke periodisch an eine Fremdapplikation sendet. Muß nur unter Win funktionieren.

Hat jemand eine Idee ob es für derartige Vorhaben eine Unit bzw. Komponente gibt ? oder gibt es ein derartiges Programm vielleicht schon ?

Wäre für Empfehlungen seeeeehr dankbar ! :mrgreen:

Gruß Cocky

Hallo Cocky,

ich habe mal nachgesehen, ob ich Dir da helfen kann. Ich hatte so was auch mal benötigt, um mich mit einer Software automatisch in eine Datenbank einzuloggen.
Es ist nicht alles auf meinem Mist gewachsen, ich suchte damals auch eine Unit. Ich hatte seinerzeit die folgende von der Delphi-Superpage geholt. Alle folgende Code-Schnipsel sind für Delphi - Version 6. Vielleicht ist das ja ein Ansatz, um Dein Problem zu lösen.

:)

Gruß Cargo_03

Code: Alles auswählen

CONST  {Definition im Globalen Teil, für ganzes Programm.}
  FensterKlasse : PChar  = 'TLoginDialog';
 
VAR     {Definition im Globalen Teil, für ganzes Programm.}
 {########## Variablen für das Oracle-Datenbank Login  #########################}
  FensterTitel   : Array[0..100] of Char; {Entschlüsselter Ger. Fenstertext}
  FindHnd        : Hwnd;                  {Handle des Gefundenen Fensters}
 
 
uses SendKeys,     {Ich weiss nicht mehr genau, aber SendKeys und ShellAPI bestimmt.}
     ShellAPI,
     ActiveX,
     RegExpr;
  
 
{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%}
{%%%%%  BEREICH - Funktionen  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%}
{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%}
 
{""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""}
{ Funktion-Name...: WINTrue                                                    }
{ Erstellt durch..: Cargo_03                                                   }
{ Stand...........: 17.08.1996                                                 }
{ Letzte Änderung.: 17.08.1996                                                 }
{ Übergabewert(e).: PChar,PChar                                                }
{ Rückgabewert....: Boolean                                                    }
{ Beschreibung....: Die Funktion liefert das Handle des gefundenen Fensters    }
{                   zurück. Dazu muß der Klassenname und der Fenstername       }
{                   bekannt sein. FensterName = TitelZeile des Fenster's       }
{""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""}
 FUNCTION WINTrue (KlassName : PChar; FensterName : PChar) :BOOLEAN;
Var H1 : hwnd;
Begin
  H1 := FindWindow(KlassName,FensterName);
  FindHnd := H1;     {FindHnd = Gefundenes Handle - für den Rest der App. wichtig}
  Result := H1 <> 0;
End;
{""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""}
{((((((((((((((((((((((      Ende der Funktion      )))))))))))))))))))))))))))}
{""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""}
 
 
{Dieser Teil wurde in Form.Create initialisiert}
 
{##########  Vorbereitung zur Erkennung des Oracle - Login  ###################}
 
  For Z := 1 to Length(ED_LoginTitel.Text) Do
 
  Begin
 
    FensterTitel[Z-1] := ED_LoginTitel.Text[Z];
 
  End;
 
 {######################################################################} 
 
 
{""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""}
{ Procedure-Name..: Oracle-Datenbank-Login                                     }
{ Erstellt durch..: Cargo_03                                                   }
{ Stand...........: 14.03.2000                                                 }
{ Letzte Änderung.: 14.03.2000                                                 }
{ Beschreibung....: Ereignisbehandlung des Timers, Taktzeit : 2 Sekunde.       }
{                   Folgende Befehle sollen abgearbeitet werden.               }
{                                                                              }
{                   - Prüfen ob Oracle-Datenbank-Login Fenster geöffnet ist,   }
{                     um dann UserName und Passwort einzutragen, anschließend  }
{                     die OK-Taste drücken.                                    }
{                                                                              }
{""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""}
 Procedure TMF.LGTimerTimer(Sender: TObject);
Begin
  FindHnd := 0;   { Handle auf NULL setzen}
  If ELogin = False Then    {Globale Variable ELogin = Boolean}
  Begin
    If WinTrue(FensterKlasse,FensterTitel) Then
    Begin {Passwort und Username immer in Großschrift eingeben.}
      SendKeysToTitle(FensterTitel,Trim(ED_UserName.Text)+CHR(9)+Trim(ED_Passwort.Text)+CHR(13));
    End;
  End;
  If KLogin = False Then
  Begin
    If WinTrue(FensterKlasse,FensterTitel) Then
    Begin {Passwort und Username immer in Großschrift eingeben.}
      SendKeysToTitle(FensterTitel,Trim(ED_KUserName.Text)+CHR(9)+Trim(ED_KPasswort.Text)+CHR(13));
    End;
  End;
  Application.ProcessMessages;
  If (ELogin = True) and (KLogin = True) Then LGTimer.Enabled := False Else LGTimer.Enabled := True;
  LGTC := Not LGTC;
  If LGTC = True Then SH_LGTimerLED.Brush.Color := clGreen Else SH_LGTimerLED.Brush.Color := clRed;
End;
{""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""}
{((((((((((((((((((((((     Ende der Procedure     ))))))))))))))))))))))))))))}
{""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""}
 
 
{****************************************************} 
{              SendKeys Unit for Delphi 32           } 
{    Copyright (c) 1999 by Borut Batagelj (Slovenia) } 
{                       Aleksey Kuznetsov (Ukraine)  } 
{            Home Page: http://www.utilmind.com" onclick="window.open(this.href);return false;             } 
{            E-Mail: info@utilmind.com               } 
{****************************************************} 
 
unit SendKeys; 
 
 
interface
 
uses
  Windows, SysUtils;
 
const
  SK_BKSP = #8;
  SK_TAB = #9;
  SK_ENTER = #13;
  SK_ESC = #27;
  SK_ADD = #107;
  SK_SUB = #109;
  SK_F1 = #228;
  SK_F2 = #229;
  SK_F3 = #230;
  SK_F4 = #231;
  SK_F5 = #232;
  SK_F6 = #233;
  SK_F7 = #234;
  SK_F8 = #235;
  SK_F9 = #236;
  SK_F10 = #237;
  SK_F11 = #238;
  SK_F12 = #239;
  SK_HOME = #240;
  SK_END = #241;
  SK_UP = #242;
  SK_DOWN = #243;
  SK_LEFT = #244;
  SK_RIGHT = #245;
  SK_PGUP = #246;
  SK_PGDN = #247;
  SK_INS = #248;
  SK_DEL = #249;
  SK_SHIFT_DN = #250;
  SK_SHIFT_UP = #251;
  SK_CTRL_DN = #252;
  SK_CTRL_UP = #253;
  SK_ALT_DN = #254;
  SK_ALT_UP = #255;
 
 
procedure SendKeyString(Text: String);
procedure SendKeysToTitle(WindowTitle: String; Text: String);
procedure SendKeysToHandle(WindowHandle: hWnd; Text: String);
procedure MakeWindowActive(wHandle: hWnd);
function GetHandleFromWindowTitle(TitleText: String): hWnd;
 
 
implementation
 
 
procedure SendKeyString(Text: String);
var
   I         : Integer;
   Shift     : Boolean;
   VK        : Word;
   ScanCode  : Word;
   ch        : Char;
   c, s      : Byte;
 
const
   vk_keys: Array[0..9] of Byte =
      (VK_HOME, VK_END, VK_UP, VK_DOWN, VK_LEFT,
       VK_RIGHT, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE);
   vk_shft: Array[0..2] of Byte = (VK_SHIFT, VK_CONTROL, VK_MENU);
   flags: Array[False..True] of Integer = (KEYEVENTF_KEYUP, 0);
 
begin
   Shift := False;
   for I := 1 to Length(Text) do
    begin
     ch := Text[I];
     if ch >= #250 then
      begin
       s := Ord(ch) - 250;
       Shift := not Odd(s);
       c := vk_shft[s shr 1];
       ScanCode := MapVirtualKey(c,0);
       Keybd_Event(c, Scancode, Flags[shift], 0);
      end
     else
      begin
       vk := 0;
       if ch >= #240 then
        c := vk_keys[Ord(ch) - 240]
       else
        if ch >= #228 then {228 (F1) => $70 (vk_F1)}
         c := Ord(ch) - 116
        else
         if ch < #110 then
          c := Ord(ch)
         else
          begin
           vk := VkKeyScan(ch);
           c := LoByte(vk);
          end;
 
       ScanCode := MapVirtualKey(c,0);
       if not Shift and (Hi(vk) > 0) then { $2A = scancode of VK_SHIFT }
        Keybd_Event(VK_SHIFT, $2A, 0, 0);
       Keybd_Event(c,scancode, 0, 0);
       Keybd_Event(c,scancode, KEYEVENTF_KEYUP, 0);
       if not Shift and (Hi(vk) > 0) then
        Keybd_Event(VK_SHIFT, $2A, KEYEVENTF_KEYUP, 0);
      end;
    end;
end;
 
 
procedure MakeWindowActive(wHandle: hWnd);
begin
  if IsIconic(wHandle) then
   ShowWindow(wHandle, SW_RESTORE)
  else 
   BringWindowToTop(wHandle); 
end; 
 
function GetHandleFromWindowTitle(TitleText: String): hWnd; 
var 
  StrBuf: Array[0..$FF] of Char; 
begin 
  Result := FindWindow(PChar(0), StrPCopy(StrBuf, TitleText)); 
end; 
 
procedure SendKeysToTitle(WindowTitle: String; Text: String); 
var 
  Window: hWnd; 
begin 
  Window := GetHandleFromWindowTitle(WindowTitle); 
  MakeWindowActive(Window); 
  SendKeyString(Text); 
end; 
 
procedure SendKeysToHandle(WindowHandle: hWnd; Text: String); 
begin 
  MakeWindowActive(WindowHandle); 
  SendKeyString(Text); 
end; 
 
end.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: simulierte Keystrokes an Fremdapplikation senden

Beitrag von af0815 »

War schon im Forum:siehe Beitrag allerdings für Linux. vielleicht ist es trotzdem hilfreich.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

_X_
Beiträge: 250
Registriert: Di 16. Dez 2008, 20:13
OS, Lazarus, FPC: aptosid (aptosid.com); Lazarus SVN gtk2+qt4; FPC 2.4.0
CPU-Target: 32/64Bit

Re: simulierte Keystrokes an Fremdapplikation senden

Beitrag von _X_ »

Wie schon im anderen Thread gesagt,
Linux: http://forge.lazarusforum.de/repositori ... eydown.pas" onclick="window.open(this.href);return false;

Crossplatfrom (Mac, Linux, Win) gibts in Lazarus/components mouseandkeyinput

mfg _X_

Antworten