Выиграть формы, логировать все клики? - PullRequest
5 голосов
/ 06 апреля 2010

Есть ли способ зарегистрировать все клики в приложении Win Forms? Я хотел бы перехватить щелчки и записать действие и имя элемента управления, вызвавшего его.

Возможно ли это?

Заранее спасибо.

ОБНОВЛЕНИЕ: Я ищу решение для всего приложения, нет ли способа добавить прослушиватель в очередь событий Windows (или как она называется)?

Ответы [ 5 ]

5 голосов
/ 06 апреля 2010

Вы можете сделать это, если основная форма вашего приложения реализует интерфейс IMessageFilter.Вы можете просматривать сообщения окна, которые он получает, и искать клики.Например:

  public partial class Form1 : Form, IMessageFilter {
    public Form1() {
      InitializeComponent();
      Application.AddMessageFilter(this);
      this.FormClosed += (o, e) => Application.RemoveMessageFilter(this);
    }

    public bool PreFilterMessage(ref Message m) {
      if (m.Msg == 0x201 || m.Msg == 0x203) {  // Trap left click + double-click
        string name = "Unknown";
        Control ctl = Control.FromHandle(m.HWnd);
        if (ctl != null) name = ctl.Name;
        Point pos = new Point(m.LParam.ToInt32());
        Console.WriteLine("Click {0} at {1}", name, pos);
      }
      return false;
    }
  }

Обратите внимание, что это регистрирует все клики в любом окне вашего приложения.

1 голос
/ 06 апреля 2010

Вы можете использовать Spy ++ или WinSpy ++ для достижения этой цели.

альтернативный текст http://www.catch22.net/sites/default/files/images/winspy1.img_assist_custom.jpg

Но я не уверен, как выВы можете достичь того же самого самостоятельно.Если это возможно, вам нужно сделать это с помощью низкоуровневого хука Windows API или обработчика сообщений, который дает вам доступ ко всем сообщениям в очереди ваших приложений.

0 голосов
/ 06 апреля 2010

В тестовом проекте NunitForms есть приложение для записи, которое следит за этим и многими другими событиями. Код очень умный и стоит посмотреть. Это проект ThoughtWorks.

Это решение Rolls Royce, хотя! ...

Попробуйте рекурсивно пройти коллекцию Controls формы и подписаться на событие в зависимости от типа.

ПК: -)

0 голосов
/ 06 апреля 2010

используйте MouseEventArgs следующим образом:

    private  void Form_MouseDown(object sender, System.WinForms.MouseEventArgs e) 
{ 
switch (e.Button) 
{ 
    case MouseButtons.Left: 
    MessageBox.Show(this,"Left Button Click"); 
    break; 
    case MouseButtons.Right: 
    MessageBox.Show(this,"Right Button Click" ); 
    break; 
    case MouseButtons.Middle: 
    break; 
    default: 
    break; 
} 

EventLog.WriteEntry("source", e.X.ToString() + " " + e.Y.ToString()); //or your own Log function

} 
0 голосов
/ 06 апреля 2010

Хорошо, вы можете подписаться на событие Click или MouseDown каждого элемента управления в форме.

...