我有一個很大的應用程序與數百個TA。它們中的每一個都被使用並實現所需的不同功能。德爾福 - 抓住所有action.onexecute從一個應用程序
從應用程序中捕獲(掛接)所有TAction.OnExecute是可能的嗎?有沒有我可以掛鉤的Windows消息,以便我可以記錄已執行的動作名稱?
我有一個很大的應用程序與數百個TA。它們中的每一個都被使用並實現所需的不同功能。德爾福 - 抓住所有action.onexecute從一個應用程序
從應用程序中捕獲(掛接)所有TAction.OnExecute是可能的嗎?有沒有我可以掛鉤的Windows消息,以便我可以記錄已執行的動作名稱?
您只需添加一個TApplicationEvents
對象並處理OnActionExecute
事件。事件處理程序通過Action
實例,因此可以輕鬆獲取操作的名稱。
OnActionExecute
事件將在操作的OnExecute
事件觸發之前觸發。您甚至可以通過在OnActionExecute
事件處理程序中將參數Handled
設置爲True
來停止發起的動作OnExecute
事件。
基於大衛的答案,我做了一個小例子:
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.
感謝。 +1並且接受 – RBA 2011-12-21 10:45:45
只是一個參考,「TApplication.OnActionExecute」事件是處理「TAction」的第二個鉤子。如果「TAction」與「TActionList」相關聯,則「TActionList.OnExecute」事件首先在「TAction」上獲得dib。如果該事件處理程序返回True,則不會觸發TApplication.OnActionExecute事件。 – 2011-12-21 18:44:51
@remy謝謝你的補充 – 2011-12-21 18:48:04