Come rilevare i clic del mouse?

come posso rilevare i clic del mouse su Windows? (XP / Vista / 7). ad esempio quando la mia applicazione è in esecuzione, rileverà se l’utente fa clic su qualcosa (non sull’interfaccia utente dell’applicazione ma sull’interfaccia utente di Windows). se sì, esegui un altro processo.

Non so se è ansible, spero che qualcuno possa darmi una guida.

Grazie!

È necessario scrivere un hook del mouse se si desidera intercettare qualsiasi clic del mouse, movimento, clic della rotella del mouse … ecc.

Questo è l’unico modo per AFAIK se si desidera monitorare l’attività del mouse al di fuori della propria applicazione. È necessario importare la funzione SetWindowsHookEx (…) dal file User32.dll se si desidera installare un hook. Implica l’interoperabilità (PInvoke) e dovrai importare (DllImport) alcune funzioni.

Ecco un documento ufficiale di Microsoft su come ottenere ciò in C #:

Come impostare un hook di Windows in Visual C #. NET

Lo riassumerò qui, solo per essere completo la risposta se il collegamento dovesse morire un giorno.

A partire dalla funzione SetWindowsHookEx:

[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); 

Ora puoi impostare il tuo hook. Per esempio:

 public class Form1 { static int hHook = 0; public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam); HookProc MouseHookProcedure; private void ActivateMouseHook_Click(object sender, System.EventArgs e) { if(hHook == 0) { MouseHookProcedure = new HookProc(Form1.MouseHookProc); hHook = SetWindowsHookEx(WH_MOUSE, MouseHookProcedure, (IntPtr) 0, AppDomain.GetCurrentThreadId()); } } } 

Non dimenticare di sganciarlo dopo. Avrai bisogno di un altro DllImport per questo:

 [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] public static extern bool UnhookWindowsHookEx(int idHook); private void DeactivateMouseHook_Click(object sender, System.EventArgs e) { bool ret = UnhookWindowsHookEx(hHook); } 

È ansible utilizzare il delegato HookProc (MouseHookProcedure) per acquisire l’attività del mouse. Ciò comporta un certo marshalling per acquisire i dati.

 [StructLayout(LayoutKind.Sequential)] public class POINT { public int x; public int y; } [StructLayout(LayoutKind.Sequential)] public class MouseHookStruct { public POINT pt; public int hwnd; public int wHitTestCode; public int dwExtraInfo; } public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) { MouseHookStruct MyMouseHookStruct = (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct)); // You can get the coördinates using the MyMouseHookStruct. // ... return CallNextHookEx(hHook, nCode, wParam, lParam); } 

Non dimenticare di chiamare in seguito il prossimo object nella catena di aghook (CallNextHookEx)!

 [DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam); 

PS: puoi fare lo stesso per la tastiera.

Il meccanismo di aghook di Windows è ciò di cui hai bisogno per lavorare. Dai un’occhiata a questo articolo: Elaborazione di hook globali per mouse e tastiera in C #

Mentre la soluzione di Christophe Geers ti aiuta a catturare l’evento del mouse, non fornisce una soluzione completa al problema. Edward voleva sapere come ottenere l’evento click.

Per ottenere l’evento click, utilizzare la soluzione fornita da Christophe Geers. E aggiungi / modifica quanto segue:

 enum MouseMessages { WM_LBUTTONDOWN = 0x0201, WM_LBUTTONUP = 0x0202, WM_MOUSEMOVE = 0x0200, WM_MOUSEWHEEL = 0x020A, WM_RBUTTONDOWN = 0x0204, WM_RBUTTONUP = 0x0205 } public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam) { //Marshall the data from the callback. MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct)); if (nCode >= 0 && MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam) { // Do something here } return CallNextHookEx(hookHandle, nCode, wParam, lParam); } 

Tutto ciò di cui hai bisogno è un hook del mouse. Può rilevare i movimenti del mouse o i clic. Puoi scaricare la demo qui: C # mouse_hook_Demo
Quando premi il mouse e lo rilasci, vedrai l’evento sul richtextbox.

 private void mh_MouseDownEvent(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { richTextBox1.AppendText("Left Button Press\n"); } if (e.Button == MouseButtons.Right) { richTextBox1.AppendText("Right Button Press\n"); } } private void mh_MouseUpEvent(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { richTextBox1.AppendText("Left Button Release\n"); } if (e.Button == MouseButtons.Right) { richTextBox1.AppendText("Right Button Release\n"); } } private void mh_MouseClickEvent(object sender, MouseEventArgs e) { //MessageBox.Show(eX + "-" + eY); if (e.Button == MouseButtons.Left) { string sText = "(" + eXToString() + "," + eYToString() + ")"; label1.Text = sText; } }