我目前正在编写一个程序,该程序在最初单击鼠标按钮时按住鼠标按钮,并继续按住鼠标按钮,直到用户第二次按下鼠标按钮。
该程序的工作原理是使用 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
库的情况下完成您的场景。
它是如何工作的?
- 第一次按下鼠标时设置标志
m_SupressNextUp
- 按下时被触发。 - 按下前一个鼠标按钮后的鼠标按钮被按下并设置标志
m_SupressNextDown
- 第二下也被抑制并重置标志
m_SupressNextUp
- Second up 被触发并重置
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();
}
}
关于c# - 拦截鼠标点击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30061813/