原文
NGA
概述:用手柄游玩FFXIV的时候,如果发生硬件变动(包括新增和删除设备),将会导致手柄短暂失去响应。这是游戏本身的问题,但我们可以通过避免设备变动的发生来规避它。
症状
在Windows用手柄游玩的时候,偶尔会有几秒钟无法操作,此时会重复之前输入的指令。
- 不管按哪个按钮都没有反应。
- 如果正在移动(左摇杆)的话,就算松开摇杆角色也会继续移动(无法控制)。
- 如果正在移动视角(右摇杆)的话,就算松开摇杆视角也会继续移动(无法控制)。
- 执行PowerShell脚本以监控是什么硬件发生了变动。
解决方案
首先是监测脚本:
# Device Manager
# 0 Other Devices
# 1 Error Devices (Yellow Bang)
# 2 Camera Number
function GetDevStatus {
$Device_other = @()
$Device_yellowbang = @()
$CameraNum=0
$All_List = Get-WmiObject -Class Win32_PNPEntity
foreach ($i in $All_List) {
if ($Null -ne $i.Name -and $Null -eq $i.PNPClass) {
$Device_other += ($i.Name)
}
if ($i.Status -eq "Error") {
$Device_yellowbang += ($i.Name)
}
if ($i.PNPClass -eq "Camera"){
$CameraNum+=1
}
}
return $Device_other, $Device_yellowbang,$CameraNum
}
function CatchChange {
Write-Host("************Listening Device Change************")
$device=Get-WmiObject -Class Win32_PNPEntity
$device_num=$device.Length
while ($device_num -eq((Get-WmiObject -Class Win32_PNPEntity).Length)){
}
if ($device_num -gt((Get-WmiObject -Class Win32_PNPEntity).Length)){
Write-Host("Remove Device")
}
else{
Write-Host("Add Device")
}
$device_Change=Get-WmiObject -Class Win32_PNPEntity
$device_Compare=Compare-Object $device $device_Change
Write-Host($device_Compare.InputObject.Name)
}
# CatchChange
$a = GetDevStatus
if ($Null -eq $a) {
Write-Host("No Error")
}
else {
Write-Host("************Other Devices************")
$a[0]
Write-Host("")
Write-Host("************YellowBang Devices************")
$a[1]
Write-Host("")
Write-Host("************Camera Num************")
$a[2]
}
while ($True){
CatchChange
}
把这个脚本保存为 script.ps1 并右键使用PowerShell运行。
这样一来,应该可以看到如下界面。回到FFXIV接着玩,发生症状之后应该就能看到脚本监控到了设备变动。Add Device和Remove Device的下面就是我们需要注意的设备。
这里造成问题的设备是'HID-compliant vendor-defined device HID-compliant mouse'(蓝牙鼠标)。在这之前也有出现过'surface pen'。因为鼠标放置一段时间的话就会自动休眠,所以会产生设备的变动。
知道了问题所在,把蓝牙鼠标的电源关掉,把手写笔收起来之后问题就解决了。
在禁用了'Microsoft Device Association Root Enumerator'之后问题并没有解决,所以写了这篇文章。
具体的处理方法根据设备不同也会不同,如果是外接设备的话关掉应该就可以了。