【发布时间】:2011-12-21 10:08:53
【问题描述】:
我有一个包含数百个 TAction 的大型应用程序。它们中的每一个都被使用并实现所需的不同功能。
可以从应用程序中捕获(挂钩)所有 TAction.OnExecute 吗?是否有任何我可以挂钩的 Windows 消息,以便我可以记录已执行的操作名称?
【问题讨论】:
标签: delphi delphi-2006
我有一个包含数百个 TAction 的大型应用程序。它们中的每一个都被使用并实现所需的不同功能。
可以从应用程序中捕获(挂钩)所有 TAction.OnExecute 吗?是否有任何我可以挂钩的 Windows 消息,以便我可以记录已执行的操作名称?
【问题讨论】:
标签: delphi delphi-2006
您只需要添加一个TApplicationEvents 对象并处理OnActionExecute 事件。事件处理程序被传递给Action 实例,因此可以很容易地获得操作的名称。
OnActionExecute 事件将在动作的 OnExecute 事件触发之前触发。您甚至可以通过在您的OnActionExecute 事件处理程序中将Handled 参数设置为True 来阻止动作的OnExecute 事件触发。
【讨论】:
TApplication.OnActionExecute 事件是处理TAction 的第二个挂钩。如果TAction 与TActionList 相关联,则TActionList.OnExecute 事件将在TAction 上获得第一个dib。如果该事件处理程序返回 True,则不会触发 TApplication.OnActionExecute 事件。
根据大卫的回答,我做了一个小例子:
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.
【讨论】: