Как запретить пользователю нажимать в любом месте экрана во время сеанса - PullRequest
2 голосов
/ 18 июня 2019

Я пишу приложение для автоматизации, в котором открывается программа, и пока эта программа открыта, я не хочу, чтобы пользователю было позволено нажимать в любом месте экрана, поскольку это может привести к сбою автоматизации в определенных точках.Я не смог найти никого, кто мог бы решить эту проблему, большинство решений предоставляют ответы только для кнопок или определенных окон, но я хочу полностью отключить щелчок мыши для пользователя.Есть ли способ сделать это?

1 Ответ

0 голосов
/ 18 июня 2019

Использовать глобальный крючок мыши

Используйте глобальную мышиную ловушку для отслеживания и при необходимости блокировки событий мыши.

Примером реализации глобальной ловушки мыши / клавиатуры является пакет MouseKeyHook и исходный код GitHub 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));

...