Как обнаружить щелчки мыши?

как я могу обнаружить щелчки мышью на Windows? (XP/Vista/7). например, когда мое приложение запущено, оно обнаруживает, что пользователь нажимает что-либо (не на этот интерфейс приложения, а на пользовательский интерфейс Windows). если да, выполните другой процесс.

Я не знаю, возможно ли это, я надеюсь, кто-то может дать мне несколько советов.

Спасибо!

Ответ 1

Вам нужно написать крючок для мыши, если вы хотите перехватить щелчки мышью, перемещение, щелчки колеса мыши... и т.д.

Это единственный способ AFAIK, если вы хотите отслеживать активность мыши вне вашего собственного приложения. Вам нужно импортировать функцию SetWindowsHookEx (...) из файла User32.dll, если вы хотите установить крючок. Он включает interop (PInvoke), и вам придется импортировать (DllImport) некоторые функции.

Вот официальный документ Microsoft о том, как добиться этого в С#:

Как установить крючок Windows в Visual С#.NET

Я обобщу его здесь, чтобы закончить ответ, если связь однажды умрет.

Начиная с функции SetWindowsHookEx:

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

Теперь вы можете настроить свой крючок. Например:

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

Не забудьте отцепить его потом. Для этого вам понадобится другой DllImport:

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

Вы можете использовать делегат HookProc (MouseHookProcedure) для захвата активности мыши. Это предполагает некоторую сортировку для сбора данных.

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

Не забудьте впоследствии вызвать следующий элемент в цепочке крюков (CallNextHookEx)!

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

PS: Вы можете сделать то же самое для клавиатуры.

Ответ 3

В то время как решение Christophe Geers помогает вам захватить событие мыши, оно не дает полного решения проблемы. Эдвард хотел знать, как получить событие click.

Чтобы получить событие click, используйте решение, предоставленное Christophe Geers. Добавьте и отредактируйте следующее:

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

Ответ 4

Все, что вам нужно - это крючок для мыши. Он может обнаруживать движение мыши или клики. Вы можете скачать демо здесь: С# mouse_hook_Demo
Когда вы нажмете мышь и отпустите ее, вы увидите событие в 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(e.X + "-" + e.Y);
            if (e.Button == MouseButtons.Left)
            {
                string sText = "(" + e.X.ToString() + "," + e.Y.ToString() + ")";
                label1.Text = sText;
            }
        }