private void timer_Tick(object sender, EventArgs e) { var timer = sender as DispatcherTimer; try { foreach (var device in _devices) { var j = device.CurrentJoystickState; var prevAxis = _axis; _axis = new int[] { j.X, j.Y }; // Состояние кнопок на предыдущей итерации var prevButtons = _buttons[device.DeviceInformation.ProductGuid]; // Текущее состояние кнопок для устройства var buttons = j.GetButtons(); for (var i = 0; i < buttons.Length; i++) { if ((buttons[i] != 0 && prevButtons == null) || (buttons[i] != 0 && prevButtons[i] != buttons[i])) { JoystickButtonDown?.Invoke(this, "J" + i); } } if (_axis[0] != prevAxis[0] && _axis[0] != STRANGENUMBER) { JoystickButtonDown?.Invoke(this, "JX" + (_axis[0] > STRANGENUMBER ? "R" : "L")); } if (_axis[1] != prevAxis[1] && _axis[1] != STRANGENUMBER) { JoystickButtonDown?.Invoke(this, "JY" + (_axis[1] > STRANGENUMBER ? "R" : "L")); } _buttons[device.DeviceInformation.ProductGuid] = buttons; } } catch (Exception ex) { timer.Stop(); UpdateDevices(); } }
protected virtual void OnJoystickButtonDown(JoystickButton button) => JoystickButtonDown?.Invoke(button);