2022.9.4

用Joy-Con在Windows电脑上捕获并保存截图

一键完成。

用Joy-Con在Windows电脑上捕获并保存截图
用Joy-Con在Windows电脑上捕获并保存截图

简而言之,JoyConScreenShot软件通过调用Xbox Game Bar软件,可以在按下Joy-Con的截图键时捕获当前运行的游戏或软件的截图并保存,或录制之前30秒的视频。

为方便介绍,除非另有说明,本文的“Joy-Con”均同时包含Switch Pro手柄。

灵感来源

在Nintendo Switch和Steam平台上都有“一键截图”功能,只需按下Joy-Con手柄或是Switch Pro手柄的“截图”键就可以直接截图并保存下来,非常方便,而Switch上甚至可以长按截图键录制之前30秒的游戏视频。然而最近我接触了Windows电脑上的Xbox游戏(准确来说应该是Microsoft Store应用),却发现这些游戏无法识别Joy-Con手柄和Switch Pro手柄;Steam虽然可以将这些游戏作为“非Steam游戏”添加并启动,但无法像普通的Win32游戏一样映射手柄按键和提供截图功能。

手柄按键映射比较好解决,例如BetterJoyXJoy都可以将Joy-Con映射为一个虚拟的Xbox 360手柄;但截图功能的实现就比较复杂了。虽然Windows 10系统自带了“截图和草图”软件,按PrintScreen键就可以调出,但调出后仍需要选择截图范围,无法一键实现“截图&保存”功能,在打游戏的时候非常不方便。

好在,Windows 10系统还包含了一个“Xbox Game Bar”软件,默认按Windows + G键可以调出,有些类似于Steam的游戏内按Shift + Tab调出的界面。这个软件可以通过Windows + Alt + PrintScreen键捕获活跃窗口的截图并直接保存,且可以通过Windows + Alt + G键录制之前30秒的视频(初次使用可能需要设置)。加上BetterJoy和XJoy都是开源软件,只需要研究一下源代码就可以明白是如何读取Joy-Con的输入并映射成虚拟手柄的。因此想到,可以通过监听Joy-Con的截图键,当截图键按下时间较短时模拟Windows + Alt + PrintScreen键捕获截图,按下时间较长时模拟Windows + Alt + G键录制视频。

解决方案

首先需要了解软件是如何读取Joy-Con的输入的。Joy-Con手柄可以通过蓝牙与Windows电脑连接,然后被识别为HID设备(人体学接口设备)。HID的相关处理使用了HidLibrary。每个设备均具有制造商ID(Vendor ID)和产品ID(Product ID),而Joy-Con的制造商为任天堂,其制造商ID为0x057e,产品ID为0x2006(左Joy-Con)、0x2007(右Joy-Con)、0x2009(Switch Pro手柄)。通过遍历所有HID设备并比对制造商ID和产品ID可以筛选出所有Joy-Con。

Joy-Con的状态可以通过读取设备信息来获取。GitHub上有对Nintendo Switch的逆向分析,名为“Nintendo_Switch_Reverse_Engineering”,其中具体介绍了Joy-Con作为HID设备的数据格式及其含义,详情可以在此链接查看。按键的相关数据在标准报告的第4字节的0x200b00100000)位,只需读取这一位的数据即可。另外需要注意的是ID为0x3f的报告数据结构与标准报告不同,其按键数据为第2字节。

在获取到按键状态后,就可以模拟Windows的按键了。按键相关处理使用了WindowsInput。根据按键时间的不同,对按键较短(0.8秒以内)的情况视为捕获截图,按下Windows + Alt + PrintScreen键;按键较长的情况视为捕获视频,按下Windows + Alt + G键。

源代码

JoyConScreenShot,按GPL-3.0授权。

如果需要在留言中发布图片,请前往GitHub上的Discussions。您也可以通过bilibili的私信功能与我联系。