2010-04-06 9 views
5

¿Hay alguna forma de registrar todos los clics en una aplicación Win Forms? Me gustaría interceptar los clics y registrar la acción y el nombre del control que la causó.¿Ganar formularios, registrar todos los clics?

¿Esto es posible?

Gracias de antemano.

ACTUALIZACIÓN: Estoy buscando una solución de aplicación amplia, ¿no hay forma de agregar un oyente a la cola de eventos de Windows (o como se llame)?

+0

crea una nueva clase que derive clase de formulario, luego pon el código de David Fox en tu nueva clase. en forma de consumidor, herede su nueva clase en lugar del Formulario predeterminado. clase pública Form1: MagicForm –

Respuesta

5

Usted puede hacer esto por tener forma principal de su aplicación implementa la interfaz IMessageFilter. Puede seleccionar los mensajes de la ventana que recibe y buscar clics. Por ejemplo:

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; 
    } 
    } 

Tenga en cuenta que este registra todos clic en cualquier ventana de la aplicación.

+0

¡Perfecto! Gracias. Había visto Application.AddMessageFilter pero no tenía idea de cómo obtener un control desde un controlador. – chillitom

0

Bien, podría suscribirse al evento Click o MouseDown de cada control en el formulario.

+0

obviamente, pero estoy buscando algo que se ocupe de esto como una preocupación transversal. En una aplicación grande, este enfoque simplemente no es factible. – chillitom

0

uso MouseEventArgs como este:

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

El proyecto de prueba NunitForms tiene una aplicación de grabadora que vigila este y muchos otros eventos. El código es muy inteligente y vale la pena mirarlo bien. Es un proyecto de ThoughtWorks.

Esa es la solución Rolls Royce sin embargo! ...

Trate de caminar de forma recursiva la colección Controls del formulario y suscribase al evento basado en el tipo.

:-) PK

Cuestiones relacionadas