-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathSystem.ClickRecorder.Mousehook.Provider.pas
More file actions
130 lines (107 loc) · 3.67 KB
/
System.ClickRecorder.Mousehook.Provider.pas
File metadata and controls
130 lines (107 loc) · 3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
unit System.ClickRecorder.Mousehook.Provider;
interface
uses
Winapi.Windows,
System.SysUtils,
System.MouseHookEvents;
type
IClickRecorderMousehookProvider = interface(IInvokable)
['{0D9FF1EB-B17D-492D-AED2-37AC21AAA4A1}']
function Start(): IClickRecorderMousehookProvider;
function Stop(): IClickRecorderMousehookProvider;
function TriggerEvent(const AValue: TProc<TPoint>): IClickRecorderMousehookProvider; overload;
function TriggerEvent(): TProc<TPoint>; overload;
function IsRecording: Boolean;
end;
TClickRecorderMousehookProvider = class(TInterfacedObject, IClickRecorderMousehookProvider)
strict private
FIsRecording: Boolean;
FMouseHookEvents: IMouseHookEvents;
FTriggerEvent: TProc<TPoint>;
public
constructor Create();
destructor Destroy; override;
function TriggerEvent(const AValue: TProc<TPoint>): IClickRecorderMousehookProvider; overload;
function TriggerEvent(): TProc<TPoint>; overload;
function Start(): IClickRecorderMousehookProvider;
function Stop(): IClickRecorderMousehookProvider;
function IsRecording: Boolean;
end;
implementation
uses
Winapi.Messages;
{ TClickRecorderMousehookProvider }
constructor TClickRecorderMousehookProvider.Create;
begin
inherited Create();
FIsRecording := False;
end;
destructor TClickRecorderMousehookProvider.Destroy;
begin
//...
inherited;
end;
function TClickRecorderMousehookProvider.Start: IClickRecorderMousehookProvider;
begin
//...
FMouseHookEvents := TMouseHookEvents.Create;
FMouseHookEvents
.MouseHookEvent(
procedure(APoint: TPoint; AWParam: WPARAM)
begin
// case AWParam of
// WM_LBUTTONDOWN: s := Format('pressed left button (%d, %d)', [APoint.x, APoint.y]);
// WM_LBUTTONUP: s := Format('released left button (%d, %d)', [APoint.x, APoint.y]);
//
// WM_MBUTTONDOWN: s := Format('pressed middle button (%d, %d)', [APoint.x, APoint.y]);
// WM_MBUTTONUP: s := Format('released middle button (%d, %d)' , [APoint.x, APoint.y]);
//
// WM_RBUTTONDOWN: s := Format('pressed right button (%d, %d)', [APoint.x, APoint.y]);
// WM_RBUTTONUP: s := Format('released right button (%d, %d)', [APoint.x, APoint.y]);
//
// WM_MOUSEMOVE: s := Format('move (%d, %d)', [APoint.x, APoint.y]);
//
// // WM_MOUSEWHEEL: begin
// // if (SmallInt(mouseData shr 16) > 0) then
// // s := 'scrolled wheel (up)')
// // else
// // s := 'scrolled wheel (down)');
// // end;
// end;
case AWParam of
WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP:
begin
if Assigned(FTriggerEvent) then
begin
FTriggerEvent(APoint);
end;
end;
end;
end
)
.Start;
FIsRecording := True;
end;
function TClickRecorderMousehookProvider.Stop: IClickRecorderMousehookProvider;
begin
if FIsRecording then
begin
FMouseHookEvents.Stop;
FMouseHookEvents := nil;
end;
FIsRecording := False;
end;
function TClickRecorderMousehookProvider.TriggerEvent(const AValue: TProc<TPoint>): IClickRecorderMousehookProvider;
begin
FTriggerEvent := AValue;
Result := Self;
end;
function TClickRecorderMousehookProvider.TriggerEvent: TProc<TPoint>;
begin
Result := FTriggerEvent;
end;
function TClickRecorderMousehookProvider.IsRecording: Boolean;
begin
Result := (FIsRecording ) //or ProcessExists());
end;
end.