拦截鼠标点击
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
库的情况下完成您的场景。
它是如何工作的?
- 第一次按下鼠标设置标志
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();
}
}
我目前正在编写一个程序,在最初单击时按住鼠标按钮,并继续按住它直到用户第二次按下鼠标按钮。
该程序的工作原理是使用 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
库的情况下完成您的场景。
它是如何工作的?
- 第一次按下鼠标设置标志
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();
}
}