我正在尝试在我的Win表单应用程序中创建每个鼠标单击的日志,该日志记录了click事件触发的方法或操作。这将包括不仅与按钮交互,还与桌子,码头等交互(这是我遇到麻烦的地方)。显然,我想避免进入我之前的所有代码,并为每个事件手动添加日志条目。截至目前,我已经有一个MessageFilter在截取每次点击方面都运行良好,但我还没弄清楚如何获得有关该点击实际执行内容的正确信息。我能够检测到使用Control.FromHandle(m.HWnd)单击的按钮,但无法区分不同的停靠面板。任何关于此的信息都表示赞赏;如果我不能很快解决这个问题,我必须手动将日志条目添加到所有内容中,我真的很想避免这种情况。谢谢!
我尝试了两种通过Control检索该信息的潜在方法,请参阅下面的PreFilterMessage:
public bool PreFilterMessage(ref Message m)
{
// if click or doubleclick
if (m.Msg == 0x201 || m.Msg == 0x0203)
{
var oneway = "1st way; " + form.FindForm().ActiveControl.ToString();
string towrite = "";
if (m.Msg == 0x201)
{ towrite += "CLICK : "; }
if (m.Msg == 0x203)
{ towrite += "DBLCLICK : "; }
string anotherway = "1st way; " + "Unknown";
Control ctl = Control.FromHandle(m.HWnd);
if (ctl != null) anotherway = "1st way; " + ctl.Name;
//log manager, just takes the log message string
Admin.Information(towrite + oneway);
Admin.Information(towrite + anotherway);
}
return false;
结果看起来像这样(穿插我的评论):
**注意:我正在使用DevExpress来替换库存UI控件
//在主视图中选择不同的停靠面板,因为你可以看到它没有区分它们,第二种方式不显示任何东西
点击:第一路; DevExpress.XtraBars.Docking.FloatForm,Text:
点击:第二路;
点击:第一路; DevExpress.XtraBars.Docking.FloatForm,Text:
点击:第二路;
点击:第一路; DevExpress.XtraBars.Docking.FloatForm,Text:
点击:第二路;
//点击自定义刷新按钮,第二种方式可以选择
点击:第一路; DevExpress.XtraBars.Docking.FloatForm,Text:
点击:第二路; btnRefresh
//点击不同的网格/表格位置,不同的停靠面板,按不同的东西排序,选择整行。第二种方法是能够检测到正确网格中的动作,但不能检测正在进行的动作
点击:第一路; DevExpress.XtraBars.Docking.FloatForm,Text:
点击:第二路; abcgrid
点击:第一路; DevExpress.XtraBars.Docking.FloatForm,Text:
点击:第二路; abcgrid
点击:第一路; DevExpress.XtraBars.Docking.FloatForm,Text:
点击:第二路; abcgrid