Программное перемещение курсора на Raspberry Pi3

Я пытаюсь программно переместить положение указателя в приложении UWP, запущенном на Raspberry Pi 3. Когда я запускаю приложение на своем локальном компьютере, появляется строка:

Window.Current.CoreWindow.PointerPosition = new Point(512, 384);

работает как положено.

Когда я развертываю приложение на Pi 3, приведенный выше код вообще не действует. Есть ли другой способ сделать это? Моя конечная цель - использовать движения мыши в направлении X в качестве входных данных для функции настройки. Мне нужно иметь возможность бесконечно определять движение в направлении X. Сейчас я пытаюсь сделать это с помощью события PointerMoved. Проблема в том, что когда указатель попадает в левую или правую границу окна, он больше не запускает событие, если я продолжаю перемещать мышь в этом направлении. Мое простое решение заключалось в том, чтобы программно центрировать курсор, если он попадает за границу. Как я уже сказал, это отлично работает на моем локальном ПК, но не работает на Raspberry Pi.


person radio_dude    schedule 06.09.2017    source источник
comment
Если событие перестает работать, как вы сказали, это звучит для меня как ошибка, и о нем следует сообщить об этом!   -  person Pedro Lamas    schedule 06.09.2017


Ответы (1)


Попробуйте с инъекцией:

    private InputInjector _inputInjector;
    private InjectedInputMouseInfo _mouse;

    private Vector2 _positionDelta;

    public MainPage()
    {
        InitializeComponent();
        Loaded += MainPage_Loaded;
    }

    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        _inputInjector = InputInjector.TryCreate();
        _inputInjector.InitializeTouchInjection(InjectedInputVisualizationMode.Indirect);

        RunMouse();
    }

    private async void RunMouse()
    {
        _positionDelta = Vector2.One;

        for (int i = 0; i < 500; i++)
        {
            await Task.Delay(10);

            if (i == 100) PointDown();
            else if (i == 400) PointUp();
            else PointMove();

            _inputInjector.InjectMouseInput(new List<InjectedInputMouseInfo>{ _mouse });
        }
    }

    private void PointDown()
    {
        _mouse = new InjectedInputMouseInfo
        {
            DeltaX = (int)_positionDelta.X,
            DeltaY = (int)_positionDelta.Y,
            MouseOptions = InjectedInputMouseOptions.LeftDown,
        };
    }

    private void PointUp()
    {
        _mouse = new InjectedInputMouseInfo
        {
            DeltaX = (int)_positionDelta.X,
            DeltaY = (int)_positionDelta.Y,
            MouseOptions = InjectedInputMouseOptions.LeftUp,
        };
    }

    private void PointMove()
    {
        _mouse = new InjectedInputMouseInfo
        {
            DeltaX = (int)_positionDelta.X,
            DeltaY = (int)_positionDelta.Y,
            MouseOptions = InjectedInputMouseOptions.Move,
        };
    }

В этом примере мышь перемещается левой кнопкой вверх / вниз

Чтобы включить эту функцию, вы должны добавить в манифест несколько строк. В теге Пакет добавьте

xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" 

В Возможности добавьте

<rescap:Capability Name="inputInjection" /><rescap:Capability Name="inputInjectionBrokered" />

Это позволяет использовать ограниченные возможности.

person Jet Chopper    schedule 06.09.2017
comment
Спасибо Jet Chopper. Это отлично сработало и теперь работает именно так, как я хочу. Я твой должник. :) - person radio_dude; 06.09.2017