2

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

该程序通过使用MouseHookListener全局检测输入来工作,然后使用输入模拟器按住已按下的鼠标按钮。

该程序能够按预期按住鼠标,但是原始鼠标单击存在问题,该信号向程序发出信号以模拟被按住的按钮;它仍然被执行。我知道 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();

            }
        }
    }
4

2 回答 2

2

我是您提到的图书馆https://github.com/gmamaladze/globalmousekeyhook的作者。

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

我相信通过下面的示例,您可以在不涉及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();
    }
}
于 2015-05-18T09:29:05.423 回答
0

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

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

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

        }
    }
}
于 2015-05-05T20:20:00.057 回答