如何阻止用户在会话期间单击屏幕上的任意位置 activity

How to stop a user from clicking anywhere on the screen during session activity

我正在编写一个自动化应用程序,其中有一个程序已打开,当该程序打开时,我不希望允许用户单击屏幕上的任何位置,因为这会导致自动化可能在特定 points.I 无法找到任何对此有解决方案的人,大多数解决方案仅提供按钮或特定 windows 的答案,但我想为用户完全禁用鼠标单击。有办法吗?

使用全局鼠标挂钩

使用全局鼠标钩子来监视和选择性地阻止鼠标事件。

全局 mouse/keyboard 挂钩的示例实现是 MouseKeyHook nuget package and the GitHub source code globalmousekeyhook

仅阻止用户点击

如果您想阻止用户点击但继续发送自动点击,您可以举起一个标志,向鼠标按下事件发出信号,不要阻止下一次点击。

注意:从升起标志到事件过滤下一次鼠标按下的一小段时间内,有很小的机会会捕获用户点击通过挂钩而不是自动点击。

阻止鼠标按下事件示例

在下面的代码中,我给出了一个使用 MouseKeyHook nuget 包在 TimeSpan 时间内全局防止鼠标点击的示例:

需要使用声明:

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