Delphi - 从应用程序中捕获所有action.onexecute

时间:2011-12-21 10:08:53

标签: delphi delphi-2006

我有一个包含数百个TActions的大型应用程序。它们中的每一个都被使用并实现所需的不同功能。

可以从应用程序中捕获(挂钩)所有TAction.OnExecute吗?有没有我可以挂钩的Windows消息,所以我可以记录执行的动作名称?

2 个答案:

答案 0 :(得分:13)

您只需添加TApplicationEvents对象并处理OnActionExecute事件。事件处理程序传递Action实例,因此可以轻松获取操作的名称。

OnActionExecute事件将在操作OnExecute事件触发前触发。您甚至可以通过在OnExecute事件处理程序中将Handled参数设置为True来停止操作OnActionExecute事件。

答案 1 :(得分:2)

根据大卫的回答,我做了一个小例子:

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.