1
0
mirror of https://github.com/moparisthebest/Simba synced 2024-08-13 16:53:59 -04:00

Added KeyUp/KeyDown/KeyPress and SendText. Should work on Windows as well on Linux.

git-svn-id: http://www.villavu.com/repositories/merlijn/mufasa@211 3f818213-9676-44b0-a9b4-5e4c4e03d09d
This commit is contained in:
Wizzup? 2009-11-08 16:23:04 +00:00
parent 6b38b276bc
commit a68d70d456
6 changed files with 151 additions and 68 deletions

View File

@ -11,7 +11,7 @@
<TargetFileExt Value=""/>
<Icon Value="0"/>
<UseXPManifest Value="True"/>
<ActiveEditorIndexAtStart Value="1"/>
<ActiveEditorIndexAtStart Value="0"/>
</General>
<VersionInfo>
<ProjectVersion Value=""/>
@ -35,8 +35,8 @@
<Filename Value="project1.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="project1"/>
<CursorPos X="1" Y="95"/>
<TopLine Value="73"/>
<CursorPos X="23" Y="98"/>
<TopLine Value="84"/>
<EditorIndex Value="0"/>
<UsageCount Value="38"/>
<Loaded Value="True"/>
@ -90,8 +90,8 @@
<Unit7>
<Filename Value="../../Units/MMLCore/input.pas"/>
<UnitName Value="Input"/>
<CursorPos X="78" Y="314"/>
<TopLine Value="296"/>
<CursorPos X="56" Y="49"/>
<TopLine Value="24"/>
<EditorIndex Value="1"/>
<UsageCount Value="13"/>
<Loaded Value="True"/>
@ -109,7 +109,7 @@
<Filename Value="../../Units/MMLCore/ocr.pas"/>
<UnitName Value="ocr"/>
<CursorPos X="11" Y="361"/>
<TopLine Value="37"/>
<TopLine Value="330"/>
<EditorIndex Value="3"/>
<UsageCount Value="14"/>
<Loaded Value="True"/>
@ -181,124 +181,124 @@
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/>
<Caret Line="483" Column="21" TopLine="459"/>
</Position1>
<Position2>
<Filename Value="../../Units/MMLCore/ocr.pas"/>
<Caret Line="656" Column="18" TopLine="636"/>
</Position2>
<Position3>
</Position1>
<Position2>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/>
<Caret Line="62" Column="33" TopLine="47"/>
</Position3>
<Position4>
</Position2>
<Position3>
<Filename Value="../../Units/MMLCore/ocr.pas"/>
<Caret Line="653" Column="39" TopLine="637"/>
</Position3>
<Position4>
<Filename Value="../../Units/MMLCore/window.pas"/>
<Caret Line="52" Column="40" TopLine="37"/>
</Position4>
<Position5>
<Filename Value="../../Units/MMLCore/window.pas"/>
<Caret Line="52" Column="40" TopLine="37"/>
<Caret Line="73" Column="33" TopLine="58"/>
</Position5>
<Position6>
<Filename Value="../../Units/MMLCore/window.pas"/>
<Caret Line="73" Column="33" TopLine="58"/>
<Caret Line="373" Column="39" TopLine="368"/>
</Position6>
<Position7>
<Filename Value="../../Units/MMLCore/window.pas"/>
<Caret Line="373" Column="39" TopLine="368"/>
</Position7>
<Position8>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/>
<Caret Line="98" Column="27" TopLine="91"/>
</Position8>
<Position9>
</Position7>
<Position8>
<Filename Value="../../Units/MMLCore/ocr.pas"/>
<Caret Line="656" Column="33" TopLine="637"/>
</Position9>
<Position10>
</Position8>
<Position9>
<Filename Value="../../Units/MMLCore/window.pas"/>
<Caret Line="63" Column="37" TopLine="47"/>
</Position10>
<Position11>
</Position9>
<Position10>
<Filename Value="project1.lpr"/>
<Caret Line="68" Column="30" TopLine="63"/>
</Position11>
<Position12>
</Position10>
<Position11>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/>
<Caret Line="487" Column="3" TopLine="469"/>
</Position11>
<Position12>
<Filename Value="project1.lpr"/>
<Caret Line="81" Column="4" TopLine="66"/>
</Position12>
<Position13>
<Filename Value="project1.lpr"/>
<Caret Line="81" Column="4" TopLine="66"/>
<Caret Line="60" Column="4" TopLine="45"/>
</Position13>
<Position14>
<Filename Value="project1.lpr"/>
<Caret Line="60" Column="4" TopLine="45"/>
<Caret Line="81" Column="4" TopLine="66"/>
</Position14>
<Position15>
<Filename Value="project1.lpr"/>
<Caret Line="81" Column="4" TopLine="66"/>
<Caret Line="60" Column="4" TopLine="45"/>
</Position15>
<Position16>
<Filename Value="project1.lpr"/>
<Caret Line="60" Column="4" TopLine="45"/>
<Filename Value="../../Units/MMLCore/ocr.pas"/>
<Caret Line="11" Column="67" TopLine="1"/>
</Position16>
<Position17>
<Filename Value="../../Units/MMLCore/ocr.pas"/>
<Caret Line="11" Column="67" TopLine="1"/>
<Caret Line="466" Column="18" TopLine="451"/>
</Position17>
<Position18>
<Filename Value="../../Units/MMLCore/ocr.pas"/>
<Caret Line="466" Column="18" TopLine="451"/>
<Caret Line="477" Column="36" TopLine="45"/>
</Position18>
<Position19>
<Filename Value="../../Units/MMLCore/ocr.pas"/>
<Caret Line="477" Column="36" TopLine="45"/>
<Caret Line="493" Column="19" TopLine="478"/>
</Position19>
<Position20>
<Filename Value="../../Units/MMLCore/ocr.pas"/>
<Caret Line="493" Column="19" TopLine="478"/>
</Position20>
<Position21>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/>
<Caret Line="98" Column="33" TopLine="91"/>
</Position21>
<Position22>
</Position20>
<Position21>
<Filename Value="../../Units/MMLCore/client.pas"/>
<Caret Line="33" Column="53" TopLine="31"/>
</Position21>
<Position22>
<Filename Value="project1.lpr"/>
<Caret Line="12" Column="6" TopLine="1"/>
</Position22>
<Position23>
<Filename Value="project1.lpr"/>
<Caret Line="12" Column="6" TopLine="1"/>
<Caret Line="41" Column="17" TopLine="23"/>
</Position23>
<Position24>
<Filename Value="project1.lpr"/>
<Caret Line="41" Column="17" TopLine="23"/>
<Caret Line="96" Column="16" TopLine="75"/>
</Position24>
<Position25>
<Filename Value="project1.lpr"/>
<Caret Line="96" Column="16" TopLine="75"/>
</Position25>
<Position26>
<Filename Value="../../Units/MMLCore/input.pas"/>
<Caret Line="47" Column="65" TopLine="33"/>
</Position25>
<Position26>
<Filename Value="project1.lpr"/>
<Caret Line="13" Column="25" TopLine="1"/>
</Position26>
<Position27>
<Filename Value="project1.lpr"/>
<Caret Line="13" Column="25" TopLine="1"/>
<Caret Line="96" Column="39" TopLine="82"/>
</Position27>
<Position28>
<Filename Value="project1.lpr"/>
<Caret Line="96" Column="39" TopLine="82"/>
</Position28>
<Position29>
<Filename Value="../../Units/MMLCore/input.pas"/>
<Caret Line="47" Column="33" TopLine="33"/>
</Position29>
<Position30>
</Position28>
<Position29>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/>
<Caret Line="477" Column="35" TopLine="469"/>
</Position29>
<Position30>
<Filename Value="project1.lpr"/>
<Caret Line="97" Column="12" TopLine="73"/>
</Position30>
</JumpHistory>
</ProjectOptions>
@ -306,7 +306,7 @@
<Version Value="8"/>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)/"/>
<OtherUnitFiles Value="$(ProjPath)/../../Units/MMLCore/;$(ProjPath)/../../Units/Misc/;$(ProjPath)/../../Units/MMLAddon/;$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)/$(LCLWidgetType)/;$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)/;$(ProjPath)/../../Units/Linux/"/>
<OtherUnitFiles Value="$(ProjPath)/../../Units/MMLCore/;$(ProjPath)/../../Units/Misc/;$(ProjPath)/../../Units/MMLAddon/;$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)/$(LCLWidgetType)/;$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)/;$(ProjPath)/../../Units/Linux/;$(LazarusDir)/components/mouseandkeyinput/"/>
</SearchPaths>
<CodeGeneration>
<Optimizations>

View File

@ -93,7 +93,9 @@ begin
writeln('Time: ' + FloatToStr(((GetTickCount - Time) / (i + 1))));
writeln(C.MOCR.GetUpTextAt(0,0)); }
C.MInput.ClickMouse(5,5, mouse_Left);
//C.MInput.ClickMouse(5,5, mouse_Left);
sleep(2000);
C.MInput.SendText('a');
C.Free;
bmp.OnDestroy:=nil;

View File

@ -0,0 +1,42 @@
{
This file is part of the Mufasa Macro Library (MML)
Copyright (c) 2009 by Raymond van Venetië and Merlijn Wajer
MML is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
MML is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with MML. If not, see <http://www.gnu.org/licenses/>.
See the file COPYING, included in this distribution,
for details about the copyright.
Keyboard.inc for the Mufasa Macro Library
}
procedure KeyDown(key: Word);
begin
CurrThread.Client.MInput.KeyDown(key);
end;
procedure KeyUp(key: Word);
begin
CurrThread.Client.MInput.KeyUp(key);
end;
procedure SendKeys(s: string);
begin
CurrThread.Client.MInput.SendText(s);
end;
procedure PressKey(key: Word);
begin
CurrThread.Client.MInput.PressKey(key);
end;

View File

@ -97,6 +97,12 @@ Sender.AddFunction(@SetColorToleranceSpeed, 'procedure SetColorToleranceSpeed(ct
Sender.AddFunction(@MoveMouse, 'procedure MoveMouse(x, y: integer);');
Sender.AddFunction(@GetMousePos, 'procedure GetMousePos(var x, y: integer);');
{Keyboard}
Sender.AddFunction(@KeyDown, 'procedure KeyDown(key: Word);');
Sender.AddFunction(@KeyUp, 'procedure KeyUp(key: Word);');
Sender.AddFunction(@PressKey, 'procedure PressKey(key: Word);');
Sender.AddFunction(@SendKeys, 'procedure SendKeys(s: string);');
{ OCR}
Sender.AddFunction(@rs_GetUpText, 'function rs_GetUpText: string;');

View File

@ -157,7 +157,6 @@ begin
SyncInfo:= TheSyncInfo;
SetLength(PluginsToLoad,0);
Client := TClient.Create;
PSScript := TPSScript.Create(nil);
PSScript.UsePreProcessor:= True;
PSScript.OnNeedFile := @RequireFile;
@ -196,6 +195,7 @@ end;
{$I PSInc/Wrappers/colour.inc}
{$I PSInc/Wrappers/math.inc}
{$I PSInc/Wrappers/mouse.inc}
{$I PSInc/Wrappers/keyboard.inc}
{$I PSInc/Wrappers/dtm.inc}
{$I PSInc/Wrappers/ocr.inc}

View File

@ -30,11 +30,13 @@ interface
uses
Classes, SysUtils,
mufasatypes, // for common mufasa types
windowutil // for mufasa window utils
windowutil, // for mufasa window utils
{$IFDEF LINUX}
,ctypes,x, xlib,xtest{,keysym} // for X* stuff
// do non silent keys with XTest.
{$ENDIF};
ctypes,x, xlib,xtest, // for X* stuff
// do non silent keys/mouse with XTest / TKeyInput.
{Later on we should use xdotool, as it allows silent input}
{$ENDIF}
MouseAndKeyInput, KeyInputIntf, lclintf;
type
TMInput = class(TObject)
constructor Create(Client: TObject);
@ -46,8 +48,10 @@ type
procedure MouseButtonActionSilent(x,y : integer; mClick: TClickType; mPress: TMousePress);
procedure ClickMouse(X, Y: Integer; mClick: TClickType);
procedure KeyUp(key: Integer);
procedure KeyDown(key: Integer);
procedure KeyUp(key: Word);
procedure KeyDown(key: Word);
procedure PressKey(key: Word);
procedure SendText(text: string);
// Not used yet.
procedure SetSilent(_Silent: Boolean);
@ -63,13 +67,14 @@ type
private
// Not used yet.
Silent: Boolean;
//KeyInput: TKeyInput;
end;
implementation
uses
Client{$IFDEF MSWINDOWS},windows{$ENDIF};
Client,{$IFDEF MSWINDOWS}windows {$ELSE}lcltype{$ENDIF};
{$IFDEF MSWINDOWS}
type
@ -123,24 +128,52 @@ constructor TMInput.Create(Client: TObject);
begin
inherited Create;
Self.Client := Client;
//Self.KeyInput := KeyInput;
end;
destructor TMInput.Destroy;
begin
//Self.KeyInput := nil;
inherited;
end;
procedure TMInput.KeyUp(key: Integer);
procedure TMInput.KeyUp(key: Word);
begin
{Self.}KeyInput.Up(Key);
end;
procedure TMInput.KeyDown(key: Integer);
procedure TMInput.KeyDown(key: Word);
begin
{Self.}KeyInput.Down(Key);
end;
procedure TMInput.PressKey(key: Word);
begin
Self.KeyDown(key);
Self.KeyUp(key);
end;
{ No using VkKeyScan }
function GetSimpleKeyCode(c: char): word;
begin
//result := ord(UpCase(c));
c := lowerCase(c);
if ((c >= 'a') and (c <= 'z')) then
Exit(VK_A + (Byte(c) - 97));
Raise Exception.CreateFMT('GetSimpleKeyCode - char is not in A..z',[]);
end;
procedure TMInput.SendText(text: string);
var
i: integer;
begin
for i := 1 to length(text) do
Self.PressKey(GetSimpleKeyCode(text[i]));
end;
procedure TMInput.GetMousePos(var X, Y: Integer);