拦截鼠标点击

Intercept Mouse Click

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

该程序的工作原理是使用 MouseHookListener and then uses an 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();

            }
        }
    }

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

输入模拟器的源代码有鼠标松开方法

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

        }
    }
}

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

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

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

它是如何工作的?

  1. 第一次按下鼠标设置标志 m_SupressNextUp - 向下触发。
  2. 鼠标按下后按下的向上按钮被抑制并设置标志 m_SupressNextDown
  3. 第二下也被抑制并重置标志m_SupressNextUp
  4. 第二个被触发并重置m_SupressNextDown
  5. 系统回到初始状态。

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