Это, вероятно, будет странным для некоторых из вас, но я не могу понять, как правильно читать вход джойстика, не блокируя мою форму пользовательского интерфейса. Я нашел этот пример в Интернете:C# чтение ввода джойстика без блокировки UI
static void Main()
{
// Initialize DirectInput
var directInput = new DirectInput();
// Find a Joystick Guid
var joystickGuid = Guid.Empty;
foreach (var deviceInstance in directInput.GetDevices(DeviceType.Gamepad,
DeviceEnumerationFlags.AllDevices))
joystickGuid = deviceInstance.InstanceGuid;
// If Gamepad not found, look for a Joystick
if (joystickGuid == Guid.Empty)
foreach (var deviceInstance in directInput.GetDevices(DeviceType.Joystick,
DeviceEnumerationFlags.AllDevices))
joystickGuid = deviceInstance.InstanceGuid;
// If Joystick not found, throws an error
if (joystickGuid == Guid.Empty)
{
Console.WriteLine("No joystick/Gamepad found.");
Console.ReadKey();
Environment.Exit(1);
}
// Instantiate the joystick
var joystick = new Joystick(directInput, joystickGuid);
Console.WriteLine("Found Joystick/Gamepad with GUID: {0}", joystickGuid);
//Query all suported ForceFeedback effects
var allEffects = joystick.GetEffects();
foreach (var effectInfo in allEffects)
Console.WriteLine("Effect available {0}", effectInfo.Name);
//Set BufferSize in order to use buffered data.
joystick.Properties.BufferSize = 128;
// Acquire the joystick
joystick.Acquire();
// Poll events from joystick
while (true)
{
joystick.Poll();
var datas = joystick.GetBufferedData();
foreach (var state in datas)
Console.WriteLine(state);
}
}
Я установил sharpdx и я могу видеть выход оси джойстика в консоли.
Теперь я хочу отображать данные о каждой оси в отдельном текстовом поле на моем пользовательском интерфейсе. Поэтому я изменил несколько строк кода:
joystick.Poll();
var data = joystick.GetBufferedData();
foreach (var state in data)
{
if (state.Offset == JoystickOffset.X)
{
textBox1.Text = state.Value.ToString();
}
}
Так что это должно передавать данные в текстовое поле. Если я напишу здесь Console.Writeline(state.Value)
, я получу данные, которые я хочу отобразить. Проблема в том, что этот while loop
блокирует пользовательский интерфейс.
Я хотел бы поставить этот цикл while в private void timer_tick
и установить частоту обновления 10 миллисекунд. Но я не знаю, как обращаться к переменным типа var joystick
в отдельной функции. Я также прочитал, что это можно сделать с асинхронным программированием. К сожалению, я застрял сейчас.
Может ли кто-нибудь помочь мне с таким простым решением, как это возможно? Пример кода был бы замечательным.
У меня может быть ответ, но я не разработчик C#. Переменные данные представляют собой массив элементов, а в цикле foreach переменная 'state' является элементом этой итерации. Это правильно? – JuanBonnett
это WinForm или WPF? – kennyzx