c# - 拦截鼠标点击

标签 c# windows mousekeyhook

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

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

程序能够按预期按住鼠标,但原始的鼠标单击信号有问题,该鼠标单击指示程序模拟按住的按钮;它仍然被执行。我知道 MouseHookListener 使用低级钩子(Hook)进行操作,但它的 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();

            }
        }
    }

最佳答案

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

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

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

它是如何工作的?

  1. 第一次按下鼠标时设置标志m_SupressNextUp - 按下时被触发。
  2. 按下前一个鼠标按钮后的鼠标按钮被按下并设置标志m_SupressNextDown
  3. 第二下也被抑制并重置标志m_SupressNextUp
  4. Second up 被触发并重置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();
    }
}

关于c# - 拦截鼠标点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30061813/

相关文章:

c++ - 使用 gSoap 链接多个 SOAP 服务时启用保持事件

c# - 全局钩子(Hook) mousedown 和 keypress 事件未触发

c# - 为什么不直接从代码中使用 Form.CenterToScreen?

c# - 在 .NET 中检测进程崩溃

c# - 如何解决 Gzip 魔数(Magic Number)丢失的问题

c# - 单元测试 Request.QueryString.ToString()

windows - 使用 WDK 10 构建(在 WDK 7 上)的等效命令

c# - 如何获取在记事本中打开的文件的文件名和路径?