Управление геймпадом при переходе в режим сна

При опросе моего геймпада, и он ничего не делает в течение минуты или двух, элемент управления PoV переходит в какой-то спящий режим и ничего не возвращает, но нажатие кнопки пробуждает его. Это нормально и есть ли способ не дать PoV спать?

Активация Ckeckbox ....

  private void CheckBoxJoystick_Checked(object sender, EventArgs e)
    {
        if (CheckboxJoystick.IsChecked.HasValue & CheckboxJoystick.IsChecked == true)
        {
            var windowHandle = Process.GetCurrentProcess().MainWindowHandle;
            _gamepad = new Gamepad(windowHandle);
            if (!_gamepad.IsAvailable) return;
            ctsGamepad?.Cancel();
            ctsGamepad = new CancellationTokenSource();
            ThreadPool.QueueUserWorkItem(DoGamepadWork, ctsGamepad.Token);
        }
    }

Основной цикл для опроса геймпада ...

  private void DoGamepadWork(object obj)
    {
        if (!_gamepad.IsAvailable) return;
        var token = (CancellationToken)obj;
        var buttontocheck = -1;
        var povtocheck = new PovPair(-1,0);
        while (true)
        {
            if (token.IsCancellationRequested)
            {
                break;
            }
            _gamepad.Poll();
            // Check buttons...
            // Check PoVs...
            Thread.Sleep(100);
        }
    }

Опрос геймпада ....

    public void Poll()
    {
        try
        {
            if (!IsAvailable) return;
            joystick.Acquire();
            joystick.Poll();
            State = joystick.GetCurrentState();
            Buttons = State.Buttons;
            Povs = State.PointOfViewControllers;
            Datas = joystick.GetBufferedData();
        }
        catch(Exception ex)
        {            }
    }

Находит прикрепленные геймпады ...

    private void Find()
    {
        foreach (var deviceInstance in directInput.GetDevices(DeviceType.Gamepad, DeviceEnumerationFlags.AttachedOnly))
            joystickGuid = deviceInstance.InstanceGuid;

        // If Gamepad not found, look for a Joystick
        if (joystickGuid == Guid.Empty)
            foreach (var deviceInstance in directInput.GetDevices(DeviceType.Joystick, DeviceEnumerationFlags.AttachedOnly))
                joystickGuid = deviceInstance.InstanceGuid;

        // If Joystick not found
        if (joystickGuid == Guid.Empty)
        {
            IsAvailable = false;
            return;
        }

        // Instantiate the joystick
        joystick = new Joystick(directInput, joystickGuid);
        joystick.SetCooperativeLevel(hWnd, CooperativeLevel.Background | CooperativeLevel.NonExclusive);

        // Set BufferSize in order to use buffered data.
        joystick.Properties.BufferSize = 128;

        // Acquire the joystick
        joystick.Acquire();
        IsAvailable = true;
        Load_Settings();
    }

можем ли мы увидеть глобальный цикл, может быть, вы заблокируете свой пользовательский интерфейс? обычно получение выполняется только один раз, или если приобретение потеряно.

Frenchy 05.11.2018 15:55

Изменен исходный пост и добавлена ​​основная логика. Не блокирует пользовательский интерфейс, и состояние не сообщает данные PoV, пока не проснется. Что касается приобретения. Я делал это только один раз и время от времени получал ошибку «не получено», делая это каждый раз, останавливал это, но не уверен, может ли это вызвать эту проблему. Не думаю, что проблема в том, что кнопки работают постоянно. -- Спасибо

user512737 05.11.2018 16:22

извините, я не вижу фреймворка, который вы используете для геймпада? directinput, xna? не могли бы вы уточнить

Frenchy 05.11.2018 18:51

SharpDX.DirectInput;

user512737 05.11.2018 18:58

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

Frenchy 05.11.2018 19:05

Изменил исходный пост и добавил код для поиска. Должно быть то, что вы ищете. --Спасибо

user512737 05.11.2018 19:16

есть ли причина, по которой вы используете неэксклюзивный в кооперативном уровне ??? у вас есть только одна программа, которой нужна флешка или несколько программ ?.

Frenchy 05.11.2018 19:21

Меньше ошибок .... потому что неисключительный доступ к устройству всегда разрешен, даже если другое приложение получило эксклюзивный доступ.

user512737 05.11.2018 19:29

Позвольте нам продолжить обсуждение в чате.

Frenchy 05.11.2018 19:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
203
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

это функциональный пример, я выбираю первый стик ... кнопка 0 останавливает цикл, и я проверяю pov [0]

using SharpDX.DirectInput;
using System;
using System.Diagnostics;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            var controller = new Controller();
        }
    }

    public class Controller
    {
        private Task pollingTask;
        private bool running;

        private JoystickState state;

        public JoystickState State => state ?? (state = controller.GetCurrentState());
        public Joystick controller;
        public Controller()
        {
            var directInput = new DirectInput();
            var handle = Process.GetCurrentProcess().MainWindowHandle;
            var diDevices = directInput.GetDevices(DeviceClass.GameControl, DeviceEnumerationFlags.AttachedOnly);
            controller = new Joystick(directInput, diDevices[0].InstanceGuid);
            controller.SetCooperativeLevel(handle, CooperativeLevel.Exclusive | CooperativeLevel.Background);
            controller.Acquire();
            running = true;
            PollJoystick();

            if (pollingTask != null)
            {
                pollingTask.Wait();
            }
            Console.WriteLine("fini");
            Console.ReadKey();
        }
        TimeSpan period = TimeSpan.FromMilliseconds(30);
        public int[] Pov => State.PointOfViewControllers;
        public bool stop => State.Buttons[0];
        public void PollJoystick()
        {
            pollingTask = Task.Factory.StartNew(() => {
                while (running)
                {
                    state = null;
                    running = !stop;
                    if (Pov[0] != -1)
                        Console.WriteLine(Pov[0]);
                    Task.Delay(period);
                }
            });
        }
    }
}

Спасибо, я преобразовал то, что у меня было, в Task.Run ((), но pov и axis по-прежнему переходят в спящий режим. Не уверен, что это решит эту проблему, но я попробую.

user512737 06.11.2018 15:37

у вас то же самое, если вы пользуетесь моей программой?

Frenchy 06.11.2018 16:44

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

user512737 06.11.2018 22:41

Другие вопросы по теме