我正在编写一个打开程序的自动化应用程序,当该程序打开时,我不希望允许用户单击屏幕上的任何位置,因为这会导致自动化可能在特定点失败。我一直找不到任何对此有解决方案的人,大多数解决方案仅提供按钮或特定窗口的答案,但我想为用户完全禁用鼠标单击。有办法做到这一点吗?
最佳答案
使用全局鼠标钩子(Hook)
使用全局鼠标钩子(Hook)来监视和选择性地阻止鼠标事件。
全局鼠标/键盘钩子(Hook)的示例实现是 MouseKeyHook nuget 包和 GitHub 源代码 globalmousekeyhook .
仅阻止用户点击
如果您想阻止用户点击但继续发送自动点击,您可以举起一个标志,向鼠标按下事件发出信号,不要阻止下一次点击。
注意:从升起标志到事件过滤下一次鼠标按下的一小段时间内,用户点击将被钩子(Hook)而不是自动化点击。
阻止鼠标按下事件示例
在下面的代码中,我给出了一个使用 MouseKeyHook 的例子用于在 TimeSpan
时间内全局防止鼠标点击的 nuget 包:
需要使用声明:
using System.Diagnostics;
using Gma.System.MouseKeyHook;
代码:
// Global hook
private IKeyboardMouseEvents _globalHook;
// Stopwatch to count the amount of time the global mouse down events are blocked
private Stopwatch _stopwatch = new Stopwatch();
// The amount of time to block global mouse down events
private TimeSpan _timeSpan;
// Attach global hook
private void Subscribe()
{
_globalHook = Hook.GlobalEvents();
_globalHook.MouseDownExt += GlobalHookMouseDownExt;
}
// Remove global hook
private void Unsubscribe()
{
_globalHook.MouseDownExt -= GlobalHookMouseDownExt;
_globalHook.Dispose();
}
// Global hook mouse down event
private void GlobalHookMouseDownExt(object sender, MouseEventExtArgs e)
{
if(_stopwatch.IsRunning)
{
if(_stopwatch.Elapsed < _timeSpan)
{
e.Handled = true;
}
else
{
_stopwatch.Stop();
}
}
}
// Block global mouse down events for timeSpan amount of time
private void BlockMouseDown(TimeSpan timeSpan)
{
_timeSpan = timeSpan;
_stopwatch.Restart();
}
用法:
// Attach global hook
Subscribe();
...
// Block mouse down event for 10 seconds
BlockMouseDown(TimeSpan.FromSeconds(10));
关于c# - 如何阻止用户在 session 事件期间单击屏幕上的任意位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56650512/