I have a big application with hundreds of TActions. Each of them is used and implements different functionality needed.
It is possible to catch (hook) all the TAction.OnExecute from an application? Is there any windows message which I can hook so I can log the action name which was executed?
You just need to add a TApplicationEvents
object and handle the OnActionExecute
event. The event handler is passed the Action
instance and so can readily obtain the name of the action.
The OnActionExecute
event will fire before the action's OnExecute
event fires. You can even stop the action's OnExecute
event from firing by setting the Handled
parameter to True
in your OnActionExecute
event handler.
Based on David's answer I've made a small example:
program Project1;
uses
ExceptionLog,
Forms,
Unit2 in 'Unit2.pas' {Form2},
AppEvnts,
Classes,
Windows,
SysUtils;
{$R *.res}
type TAppEventsHack = class
procedure onAppEvtExec(Action:TBasicAction;var Handled:Boolean);
end;
var aEvHack : TAppEventsHack;
aAppEvents : TApplicationEvents;
{ TAppEventsHack }
procedure TAppEventsHack.onAppEvtExec(Action: TBasicAction;
var Handled: Boolean);
begin
OutputDebugString(PAnsiChar(Action.Name));
Handled := False;
end;
begin
Application.Initialize;
try
aEvHack := TAppEventsHack.Create;
aAppEvents := TApplicationEvents.Create(nil);
aAppEvents.OnActionExecute := aEvHack.onAppEvtExec;
Application.CreateForm(TForm2, Form2);
Application.Run;
finally
freeandnil(aEvHack);
freeandnil(aAppEvents);
end;
end.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With