2011-03-16 56 views
0

我使用以下代碼記錄我們的WinForms應用程序中的每次點擊。本質上,它從它的HWND中查找一個控件,然後打印該控件及其所有父母的類型和名稱。像MainForm的 「mywindow的」>的TabPanel 「mainTab」>按鈕的東西 「保存」如何在WPF中記錄點擊控件的名稱/路徑?

internal class ClickLogger : IMessageFilter 
{ 
    private const int WM_LBUTTONDOWN = 0x0201; 
    private const int WM_LBUTTONDBLCLK = 0x0203; 
    private const int WM_RBUTTONDOWN = 0x0204;   
    private const int MaxRecurseDepth = 30; 

    private readonly ILogger _log; 

    public ClickLogger(ILogger logger) 
    { 
     _log = logger; 
    } 

    [DebuggerStepThrough] 
    public bool PreFilterMessage(ref Message message) 
    { 
     if (message.Msg == WM_LBUTTONDOWN 
      || message.Msg == WM_RBUTTONDOWN 
      || message.Msg == WM_LBUTTONDBLCLK) 
     { 
      string path = "Unknown"; 

      Control ctl = Control.FromHandle(message.HWnd); 
      if (ctl != null) 
      { 
       path = PathFromControl(ctl, MaxRecurseDepth).ToString(); 
      } 

      string logEntry = string.Format("{0} Click on {1}", 
       WndMsgToClickName(message.Msg), path); 

      if (_log.IsInfoEnabled) 
      { 
       _log.Info(logEntry); 
      } 
     } 

     return false; 
    } 

    private StringBuilder PathFromControl(Control control, int maxDepth) 
    { 
     if(maxDepth == 0) 
     { 
      _log.Warn("Max recursion {0} reached whilst resolving path of control", MaxRecurseDepth); 
      return new StringBuilder("ERR"); 
     } 

     string name = control.GetType().Name; 
     if (control.Name.IsNotBlank()) 
     { 
      name = name + "\"" + control.Name + "\""; 
     } 

     if (control.Parent != null && control.Parent != control) 
     { 
      return PathFromControl(control.Parent, maxDepth - 1).Append(">").Append(name); 
     } 

     return new StringBuilder(name); 
    } 

    public void Initialize() 
    { 
     Application.AddMessageFilter(this); 
    } 

    private static string WndMsgToClickName(int msgId) 
    { 
     switch (msgId) 
     { 
      case WM_LBUTTONDOWN: 
       return "Left"; 
      case WM_LBUTTONDBLCLK: 
       return "Double"; 
      case WM_RBUTTONDOWN: 
       return "Right"; 
      default: 
       return "0x" + Convert.ToString(msgId, 16); 
     } 
    } 
} 

最近我們開始拌WPF的WinForms和上面的點擊記錄器簡單地打印 「未知」任何點擊一個WPF控件。

有沒有一種方法可以對WPF控件執行類似的技巧?一種可以跨技術工作的方法會很好。

回答

1

好吧,它並不完全適用於各種技術,但對於wpf,您可以使用this的組合來獲得點擊和this問題中的任何幫助者循環訪問父項以獲取路徑。