Существует ли способ зарегистрировать все щелчки в приложении Форм Победы? Я хотел бы прервать щелчки и записать действие и название управления, которое вызвало его.
Действительно ли это возможно?
Заранее спасибо.
ОБНОВЛЕНИЕ: я ищу приложение широкое решение, нет ли никакой способ добавить слушателя очереди событий окон (или чем когда-нибудь это называют)?
Вы можете сделать это, если в основной форме вашего приложения будет реализован интерфейс IMessageFilter. Вы можете просматривать сообщения Window, которые оно получает, и искать клики. Например:
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;
}
}
Обратите внимание, что при этом регистрируются все клики в любом окне вашего приложения.
Что ж, вы можете подписаться на событие Click
или MouseDown
для каждого элемента управления в форме.
используйте 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
}
В тестовом проекте NunitForms есть записывающее приложение, которое отслеживает это и многие другие события. Код очень умный и заслуживает внимательного изучения. Это проект ThoughtWorks.
Это решение Rolls Royce! ...
Попробуйте рекурсивно пройти по коллекции Controls формы и присоединиться к событию в зависимости от типа.
PK: -)
Для этого можно использовать Spy ++ или WinSpy ++ .
альтернативный текст http://www.catch22.net/sites/default/files/images/winspy1.img_assist_custom.jpg
Но я не уверен, как вы можете добиться того же самого. Если возможно, вам нужно будет сделать это с помощью низкоуровневой ловушки Windows API или обработчика сообщений, который дает вам доступ ко всем сообщениям в очереди ваших приложений.