如何在C#/.NET 6中控制Windows音视频录制的启停?
实现Windows录屏启停的几种方案
一、使用官方WinRT API(推荐)
Windows自带的Game Bar录屏(对应Win+Alt+R快捷键)可以通过Windows.Gaming.UI.GameBarManager这个WinRT API直接控制,无需模拟按键,可靠性更高。
步骤:
配置.NET 6控制台项目支持WinRT:
编辑项目文件(.csproj),添加以下配置:<PropertyGroup> <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework> <EnableWindowsTargeting>true</EnableWindowsTargeting> </PropertyGroup>安装NuGet包
Microsoft.Windows.CsWinRT(版本需匹配你的Windows SDK版本)编写控制代码:
using Windows.Gaming.UI; class Program { static void Main(string[] args) { if (GameBarManager.IsSupported()) { // 触发录屏启停,和Win+Alt+R效果完全一致 GameBarManager.GetDefault().ToggleRecording(); } else { Console.WriteLine("当前系统不支持Game Bar录屏功能"); } } }
注意事项:
- 仅支持Windows 10 1903及以上版本
- 需确保用户已在系统设置中启用Xbox Game Bar(设置 -> 游戏 -> Xbox Game Bar)
- 部分环境下需以管理员权限运行程序
二、修复模拟按键的问题
如果坚持使用模拟按键方式,之前的失败大概率是按键发送顺序或API选择不当,以下是基于SendInput的正确实现:
完整NativeWin32代码:
using System; using System.Runtime.InteropServices; class Program { [StructLayout(LayoutKind.Sequential)] struct INPUT { public int type; public InputUnion u; } [StructLayout(LayoutKind.Explicit)] struct InputUnion { [FieldOffset(0)] public KEYBDINPUT ki; } [StructLayout(LayoutKind.Sequential)] struct KEYBDINPUT { public ushort wVk; public ushort wScan; public uint dwFlags; public uint time; public IntPtr dwExtraInfo; } const int INPUT_KEYBOARD = 1; const uint KEYEVENTF_KEYUP = 0x0002; [DllImport("user32.dll", SetLastError = true)] static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); [DllImport("user32.dll")] static extern ushort MapVirtualKey(ushort uCode, uint uMapType); static void PressKey(ushort keyCode) { var input = new INPUT { type = INPUT_KEYBOARD, u = new InputUnion { ki = new KEYBDINPUT { wVk = keyCode, wScan = MapVirtualKey(keyCode, 0), dwFlags = 0, dwExtraInfo = IntPtr.Zero } } }; SendInput(1, new[] { input }, Marshal.SizeOf(typeof(INPUT))); } static void ReleaseKey(ushort keyCode) { var input = new INPUT { type = INPUT_KEYBOARD, u = new InputUnion { ki = new KEYBDINPUT { wVk = keyCode, wScan = MapVirtualKey(keyCode, 0), dwFlags = KEYEVENTF_KEYUP, dwExtraInfo = IntPtr.Zero } } }; SendInput(1, new[] { input }, Marshal.SizeOf(typeof(INPUT))); } static void ToggleScreenRecording() { // 严格按顺序按下按键:Win -> Alt -> R PressKey(0x5B); // VK_LWIN PressKey(0x12); // VK_MENU PressKey(0x52); // VK_R // 反向释放按键:R -> Alt -> Win ReleaseKey(0x52); ReleaseKey(0x12); ReleaseKey(0x5B); } static void Main(string[] args) { ToggleScreenRecording(); } }
关键修复点:
- 使用
SendInput替代过时的keybd_event,系统兼容性更强 - 严格遵循按键按下和释放的顺序(按下顺序与手动操作一致,释放顺序相反)
- 通过
MapVirtualKey获取正确的按键扫描码,确保系统能识别快捷键
三、GeForce ShadowPlay控制方案
若要控制ShadowPlay录制,除模拟Alt+F9外,需注意:
- 确保ShadowPlay已启用"允许键盘快捷键控制"(NVIDIA控制面板 -> 视频 -> ShadowPlay)
- 模拟按键时,需保证ShadowPlay后台服务处于运行状态,部分场景下需要前台有游戏窗口激活
内容的提问来源于stack exchange,提问作者user3505708
相关产品推荐
相关产品推荐

