C# 拦截鼠标点击

C# 拦截鼠标点击,c#,windows,mousekeyhook,C#,Windows,Mousekeyhook,我目前正在编写一个程序,在最初单击鼠标按钮时按住鼠标按钮,并继续按住它直到用户再次按下鼠标按钮 该程序的工作原理是使用全局检测输入,然后使用按住已按下的鼠标按钮 程序能够按预期按住鼠标,但原始鼠标点击存在问题,该问题向程序发出信号,以模拟按住按钮;它仍然得到执行。我知道MouseHookListener使用低级钩子进行操作,但是它的HookCallBack()方法由于受到保护而无法被重写 有没有办法阻止原始的鼠标输入?或者有没有一种方法可以使原始输入保持不变,直到再次单击鼠标 这是我迄今为止编写

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

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

程序能够按预期按住鼠标,但原始鼠标点击存在问题,该问题向程序发出信号,以模拟按住按钮;它仍然得到执行。我知道MouseHookListener使用低级钩子进行操作,但是它的HookCallBack()方法由于受到保护而无法被重写

有没有办法阻止原始的鼠标输入?或者有没有一种方法可以使原始输入保持不变,直到再次单击鼠标

这是我迄今为止编写的代码(注意-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);
            sim.Mouse.LeftButtonUp(); //maybe try this
        }

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

        }
    }
}

我是你提到的图书馆的作者

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

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

它是如何工作的?
  • 第一次鼠标按下设置标志
    m_supersnextup
    -按下被触发
  • 按下“上一次按下”之后的“上一次按下”鼠标按钮,并设置标志
    m_supersnextdown
  • 第二个向下也被抑制,并重置标志
    m_supersnextup
  • 第二次启动并重置
    m_supersnextdown
  • 系统返回到初始状态


  • 不幸的是,这并没有多大改变。我应该解释一下代码,所以这是我的错。仅当用户第二次单击鼠标时,才会输入isDown为true时的代码。它不受模拟输入的影响。同样,我的问题是,我需要停止将原来的鼠标单击发送到目的地(即它的目的地程序)。不过,谢谢你的建议。至于关于反转输入的部分,当用户再次单击鼠标时,它会释放先前设置的LeftButtonDown。@LiamKelly so
    mListener
    仅在第二次单击时触发?bool默认为false。因此,我认为is
    Down=true
    首先被触发。不,用户每次单击都会触发mListener。第一次(激活)点击进入else条件,然后第二次(终止)点击进入第一个条件。此代码执行它需要的操作。很高兴看到开发人员对代码中的小问题感兴趣。^^更新后的代码可以在按下鼠标时按住鼠标,但在某些应用程序中似乎不起作用,但确实起作用。不过,这可能就是我测试它的应用程序。我在一个叫Warframe的游戏上测试了它(我正在开发的这个工具是为了减少手指的疲劳,顺便说一句),它在那里不起作用,但在其他程序上可以突出显示文本,等等。这只是给其他使用它的人注意的东西。进一步的测试表明,事实上这就是我测试它的应用程序。然而,它以前允许通过输入模拟器进行输入。
        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();
    
            }
        }
    }
    
    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();
        }
    }