拦截鼠标点击
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 条件,然后在第二次(终止)点击属于第一个条件。以上是关于拦截鼠标点击的主要内容,如果未能解决你的问题,请参考以下文章