【发布时间】:2018-11-05 14:32:51
【问题描述】:
当轮询我的游戏手柄并且它在一两分钟内什么都不做时,PoV 控件进入某种睡眠模式并且不返回任何内容,但选择了一个按钮将其唤醒。这是正常的吗?有没有办法让 PoV 不睡觉?
复选框激活....
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();
}
【问题讨论】:
-
我们能看到全局循环吗,也许你阻止了你的用户界面?通常获取只进行一次,或者如果获取丢失..
-
修改原帖,放入主逻辑。不阻塞 UI 并且状态在唤醒之前不会报告任何 PoV 数据。就收购而言。我只做了一次,并且会时不时地得到一个未获得的错误,每次都这样做会阻止它,但不确定它是否会导致这个问题。我认为这不是问题,因为按钮一直都在工作。 -- 谢谢
-
抱歉,我没有看到您用于游戏手柄的框架?直接输入,xna?你能准确吗
-
SharpDX.DirectInput;
-
好的,你能显示 Gamepad 类吗,我想知道你是如何枚举控制器的,你正在使用的合作级别......
标签: c# wpf sharpdx joystick gamepad