Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 除了低级钩子和原始输入之外,还有其他方法检测全局鼠标钩子吗?_C#_.net - Fatal编程技术网

C# 除了低级钩子和原始输入之外,还有其他方法检测全局鼠标钩子吗?

C# 除了低级钩子和原始输入之外,还有其他方法检测全局鼠标钩子吗?,c#,.net,C#,.net,我正在尝试检测全局鼠标点击,并使用C#在我的Windows桌面应用程序中移动 通过使用低级鼠标挂钩,我成功地做到了这一点。然而,它自己悄悄地脱钩了,我再也找不到它了 RawInput函数也不适用 那么,除了低级鼠标钩子和rawinput函数之外,还有其他方法检测全局鼠标钩子吗 private const int WH_MOUSE_LL = 14; private static Win32Interop.LowLevelHookProc _proc = HookCallback;

我正在尝试检测全局鼠标点击,并使用C#在我的Windows桌面应用程序中移动

通过使用低级鼠标挂钩,我成功地做到了这一点。然而,它自己悄悄地脱钩了,我再也找不到它了

RawInput函数也不适用

那么,除了低级鼠标钩子和rawinput函数之外,还有其他方法检测全局鼠标钩子吗

   private const int WH_MOUSE_LL = 14;

   private static Win32Interop.LowLevelHookProc _proc = HookCallback;

    private static IntPtr _hookID = IntPtr.Zero;

    public static void Install()
    {
        _hookID = SetHook(_proc);
        StartRehookTimer();
    }

    private static IntPtr SetHook(Win32Interop.LowLevelHookProc proc)
    {
        return Win32Interop.SetWindowsHookEx(WH_MOUSE_LL, proc, IntPtr.Zero, 0);
    }

    private static void StartRehookTimer()
    {
        Timer _timerClock = new Timer
        {
            Interval = 300000
        };
        _timerClock.Elapsed += OnTimer;
        _timerClock.Enabled = true;
    }

    private static void OnTimer(object sender, ElapsedEventArgs e)
    {
        bool unhookSuccess = false;
        if (_hookID != IntPtr.Zero)
        {
            // uninstall system-wide hook

            unhookSuccess = Win32Interop.UnhookWindowsHookEx(_hookID);

            _hookID = IntPtr.Zero;
        }
        _hookID = SetHook(_proc);
        Debug.WriteLine("Unhook: Calling UnhookWindowsHookEx" + unhookSuccess + _hookID);
    }

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0 &&
            MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam)
        {
            Debug.WriteLine("Mouse Down-----");
        }

        return Win32Interop.CallNextHookEx(_hookID, nCode, wParam, lParam);
    }

请添加一个最小的可复制代码示例,以便有人能够提供帮助。您到底尝试了什么?也许你做错了。如果您显示代码并解释正在发生的事情(为什么您不能重新挂钩,您是否遇到异常或什么?),我们可能会帮助您“它会自动以静默方式解除挂钩”,添加每5分钟重新挂钩鼠标事件的代码,以便可以忽略静默解除挂钩的问题。但是,重新挂钩后不会调用回调函数,尽管unhooksuccess为true,并且重置挂钩时返回的指针不为零。请添加一个最小的可复制代码示例,以便有人提供帮助。您到底尝试了什么?也许你做错了。如果您显示代码并解释正在发生的事情(为什么您不能重新挂钩,您是否遇到异常或什么?),我们可能会帮助您“它会自动以静默方式解除挂钩”,添加每5分钟重新挂钩鼠标事件的代码,以便可以忽略静默解除挂钩的问题。但是,重新挂钩后不会调用回调函数,尽管unhooksuccess为true,并且重置挂钩时返回的指针不为零。