【问题标题】:Delphi - Catch all action.onexecute from an applicationDelphi - 从应用程序中捕获所有 action.onexecute
【发布时间】:2011-12-21 10:08:53
【问题描述】:

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

可以从应用程序中捕获(挂钩)所有 TAction.OnExecute 吗?是否有任何我可以挂钩的 Windows 消息,以便我可以记录已执行的操作名称?

【问题讨论】:

    标签: delphi delphi-2006


    【解决方案1】:

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

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

    【讨论】:

    • 仅供参考,TApplication.OnActionExecute 事件是处理TAction 的第二个挂钩。如果TActionTActionList 相关联,则TActionList.OnExecute 事件将在TAction 上获得第一个dib。如果该事件处理程序返回 True,则不会触发 TApplication.OnActionExecute 事件。
    【解决方案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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 2010-09-15
      • 1970-01-01
      • 2015-11-30
      • 2017-04-13
      • 2019-03-02
      • 2014-02-14
      相关资源
      最近更新 更多