Delphi-从应用程序捕获所有操作.onexecute

Delphi-从应用程序捕获所有操作.onexecute,delphi,delphi-2006,Delphi,Delphi 2006,我有一个大的应用程序,有数百种触觉。它们中的每一个都被使用并实现所需的不同功能 是否可以从应用程序捕获(钩住)所有TAction.OnExecute?是否有可以挂接的windows消息,以便记录已执行的操作名称 您只需要添加一个对象并处理事件。事件处理程序被传递给操作实例,因此可以很容易地获得操作的名称 OnActionExecute事件将在操作的OnExecute事件触发之前触发。您甚至可以通过在OnActionExecute事件处理程序中将Handled参数设置为True来停止操作的OnEx

我有一个大的应用程序,有数百种触觉。它们中的每一个都被使用并实现所需的不同功能

是否可以从应用程序捕获(钩住)所有TAction.OnExecute?是否有可以挂接的windows消息,以便记录已执行的操作名称

您只需要添加一个对象并处理事件。事件处理程序被传递给
操作
实例,因此可以很容易地获得操作的名称


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

基于David的回答,我举了一个小例子:

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.

仅供参考,
TApplication.OnActionExecute
事件是处理
TAction
的第二个钩子。如果
TAction
TActionList
关联,则
TActionList.OnExecute
事件在
TAction
上获得第一个DIB。如果该事件处理程序返回True,则不会触发
TApplication.OnActionExecute
事件。