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