如何检测鼠标点击

本文关键字:鼠标 检测 何检测 | 更新日期: 2023-09-27 18:09:07

如何检测Windows上的鼠标点击?(XP或Vista/7)。例如,当我的应用程序正在运行时,它将检测用户是否点击某些东西(不是在该应用程序UI上,而是在Windows UI上)。是=>执行其他进程。

我不知道这是否可能,我希望有人能给我一些指导。

谢谢!

如何检测鼠标点击

如果你想拦截任何鼠标点击、移动、鼠标滚轮点击等,你需要编写一个鼠标钩子。

如果你想在你自己的应用程序之外跟踪鼠标活动,这是唯一的方法。如果你想安装钩子,你需要从User32.dll文件中导入SetWindowsHookEx(…)函数。它涉及到互操作(PInvoke),你必须导入(DllImport)一些函数。

这是微软关于如何在c#中实现这一点的官方文档:

如何在Visual c# .NET中设置Windows钩子

我把它总结在这里,只是为了完整的答案,如果有一天链接死了。

从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:你也可以对键盘做同样的操作

Windows钩子机制是你需要使用的。在c#中处理全局鼠标和键盘钩子

虽然Christophe Geers的解决方案可以帮助您捕获鼠标事件,但它并没有为该问题提供完整的解决方案。Edward想知道如何获得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);
}