拦截鼠标点击

Posted

技术标签:

【中文标题】拦截鼠标点击【英文标题】:Intercept Mouse Click 【发布时间】:2015-05-05 19:39:11 【问题描述】:

我目前正在编写一个程序,它在最初单击鼠标按钮时按住鼠标按钮,并继续按住它直到用户第二次按下鼠标按钮。

该程序的工作原理是使用MouseHookListener 全局检测输入,然后使用input simulator 按住已按下的鼠标按钮。

程序能够按预期按住鼠标,但是原始鼠标单击存在问题,该信号指示程序模拟按住的按钮;它仍然被执行。我知道 MouseHookListener 使用低级别的钩子来操作,但是它的 HookCallBack() 方法由于受到保护而不能被覆盖。

有没有办法屏蔽掉原来的鼠标输入?或者有没有办法让原始输入保持不变,直到再次单击鼠标?

这是我到目前为止生成的代码(注意 - mListener 正在其他论坛中激活):

    public MouseHold()
    
        mListener = new MouseHookListener(new GlobalHooker());
        mListener.MouseClick += mListener_MouseClick;
    

    private bool isDown;
    private int count = 0;
    private InputSimulator sim = new InputSimulator();

    public MouseHookListener mListener;        

    private void mListener_MouseClick(object sender, MouseEventArgs e)
    
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        
            if (isDown)
            
                isDown = false;                    
                Console.Out.WriteLine(count);
            

            else
            
                Console.Out.WriteLine(count);
                isDown = true;
                sim.Mouse.LeftButtonDown();

            
        
    

【问题讨论】:

【参考方案1】:

我是你提到的库的作者https://github.com/gmamaladze/globalmousekeyhook。

为了启用您的用例,我已经通过一个事件扩展了库。请注意,新版本中监听器的构造也略有变化。

我相信通过下面的示例,您可以在不涉及 InputSimulator 库的情况下完成您的场景。

它是如何工作的?

    首先鼠标向下设置标志m_SupressNextUp - 向下触发。 上一个向下的鼠标按钮向上被抑制并设置标志m_SupressNextDown 第二次下降也被抑制并重置标志m_SupressNextUp 第二次启动并重置m_SupressNextDown 系统返回初始状态。

internal class Sample

    private IKeyboardMouseEvents m_GlobalHook;
    private bool m_SupressNextUp;
    private bool m_SupressNextDown;

    public void Subscribe()
    
        m_GlobalHook = Hook.GlobalEvents();

        m_GlobalHook.MouseDownExt += GlobalHookMouseDownExt;
        m_GlobalHook.MouseUpExt += GlobalHook_MouseUpExt;
    

    void GlobalHook_MouseUpExt(object sender, MouseEventExtArgs e)
    
        if (e.Button == MouseButtons.Left)
        
            if (m_SupressNextUp)
            
                Console.WriteLine(@"First mouse up supress.");
                e.Handled = true;
                m_SupressNextDown = true;
            
            else
            
                Console.WriteLine(@"Second mouse up - make it heppen.");
                m_SupressNextDown = false;
            
        
    

    private void GlobalHookMouseDownExt(object sender, MouseEventExtArgs e)
    
        if (e.Button == MouseButtons.Left)
        
            if (m_SupressNextDown)
            
                Console.WriteLine(@"Second mouse down supress.");
                e.Handled = true;
                m_SupressNextUp = false;
            
            else
            
                Console.WriteLine(@"First mouse down - make it heppen.");
                m_SupressNextUp = true;
            
        
    

    public void Unsubscribe()
    
        m_GlobalHook.MouseDownExt -= GlobalHookMouseDownExt;
        m_GlobalHook.MouseUpExt -= GlobalHook_MouseUpExt;

        m_GlobalHook.Dispose();
    

【讨论】:

这段代码做了它需要做的事情。很高兴看到开发人员对代码的小问题感兴趣。 ^^ 更新后的代码适用于在按下鼠标时按住鼠标,但它似乎在某些应用程序中不起作用 - 但确实有效。不过,这可能是我正在测试它的应用程序。我在一个名为 Warframe 的游戏上测试它(我正在开发的这个工具是为了减少手指的压力),但它在那里不起作用,但在其他程序上可以突出显示文本,等等。只是供其他使用此功能的人注意。 进一步的测试表明它实际上是我正在测试它的应用程序。然而,它以前允许通过输入模拟器进行输入。【参考方案2】:

查看输入模拟器的文档后,我猜您需要反转鼠标向下输入。

输入模拟器的源代码有鼠标向上的方法

    private void mListener_MouseClick(object sender, MouseEventArgs e)

    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    
        if (isDown)
        
            isDown = false;                    
            Console.Out.WriteLine(count);
            sim.Mouse.LeftButtonUp(); //maybe try this
        

        else
        
            Console.Out.WriteLine(count);
            isDown = true;
            sim.Mouse.LeftButtonDown();

        
    

【讨论】:

不幸的是,这并没有太大变化。我应该稍微解释一下代码,所以这是我的错。 isDown 为 true 时的代码,仅在用户第二次单击鼠标时输入。它不受模拟输入的影响。同样,我的问题是我需要停止将原始鼠标点击发送到目的地(即它所针对的程序)。不过,谢谢你的建议。至于反转输入的部分,当用户再次点击鼠标时,会释放之前设置的LeftButtonDown。 @LiamKelly 所以mListener 只在第二次点击时触发?布尔默认为假。所以我认为是Down=true首先被触发。 不,mListener 在用户每次点击时触发。第一次(激活)点击属于 else 条件,然后在第二次(终止)点击属于第一个条件。

以上是关于拦截鼠标点击的主要内容,如果未能解决你的问题,请参考以下文章

.NET下如何拦截鼠标、键盘消息?Win32NET来帮你

监控用户鼠标点击停留行为,美国棒约翰披萨被顾客起诉赔偿

.NET下如何拦截鼠标键盘消息?Win32NET来帮你

C#怎么模拟鼠标点击

unity中为啥鼠标点击后就看不见鼠标了

jquery鼠标点击事件是啥?