c# - 如何阻止用户在 session 事件期间单击屏幕上的任意位置

标签 c# click

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

最佳答案

使用全局鼠标钩子(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/

相关文章:

c# - 无法使用 SSH.NET 库连接到 AIX(Unix) 框 - 错误 : Value cannot be null

C# 单元测试资源

c# - 获取程序集的全名

java - JFreeChart XYPlot XYImageAnnotation 鼠标点击监听器

jquery - 处理只有值的 div

c# - ObjectContext.ExecuteStoreCommand 无法识别参数

c# - 为特定打印机创建任何文件格式的 .PRN 文件的程序/算法!请帮忙!

javascript - 使用按钮的值而不是它的 id 通过 JavaScript 模拟按钮点击?

javascript - 按住 Enter 键时单击事件会多次触发

jquery - 触发asp.net链接按钮点击回车键