在Delphi

时间:2017-12-16 08:20:30

标签: delphi logging mouse

我正在尝试跟踪和记录用户在我的应用中执行的操作。一种帮助方法是列出他们在使用程序时点击的按钮和菜单等。然后,如果程序因任何原因崩溃,我会记录他们尝试重现问题的确切步骤。

所以我在主窗体上放了一个ApplicationEvents组件,然后在OnMessage下使用...

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean);
var Target: TControl;
    Point: TPoint;
begin
     Handled := FALSE;
     if (Msg.Message = WM_LBUTTONDOWN) then
     begin
          GetCursorPos(Point);
          Target := FindDragTarget(Point,True);
          if Assigned(Target) then
          begin
               AddLogText('CLICKED '+(Target).owner.name+'.'+(Target).name);
          end;
    end;
end;

这似乎有效,我可以记录所有点击,但有一个令人讨厌的副作用。有时候,如果没有可重复调整的步骤,上面的代码似乎只需点击鼠标即可。这意味着在看似随机的时间工具栏按钮不会单击并需要双击。或者需要双击对话框按钮。毋庸置疑,在我意识到它只是在我的应用程序中发生之前,这让我很烦人并让我对我的鼠标提出质疑。

如果我注意上面的代码,问题就消失了。

那么有没有人有可靠的方法来记录我的Delphi程序中所有表单/对象的所有点击而不会导致不良副作用?我想截取并记录所有点击,但没有神秘地吃掉任何消息。

编辑:在下面的有用评论之后,这是当前的工作代码。

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;var Handled: Boolean);
var Target: TControl;
    Point: TPoint;
begin
     Handled := FALSE;
     if (Msg.Message = WM_LBUTTONDOWN) then
     begin
          Point.X := Msg.pt.X;
          Point.Y := Msg.pt.Y;
          Target := FindDragTarget(Point,True);
          if Assigned(Target) and Assigned(Target.Owner) then
          begin
               //use (Target).owner.name and (Target).name for logging here
          end;
     end;
end;

0 个答案:

没有答案