You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#/.NET 6中控制Windows音视频录制的启停?

实现Windows录屏启停的几种方案

一、使用官方WinRT API(推荐)

Windows自带的Game Bar录屏(对应Win+Alt+R快捷键)可以通过Windows.Gaming.UI.GameBarManager这个WinRT API直接控制,无需模拟按键,可靠性更高。

步骤:

  1. 配置.NET 6控制台项目支持WinRT:
    编辑项目文件(.csproj),添加以下配置:

    <PropertyGroup>
      <TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>
      <EnableWindowsTargeting>true</EnableWindowsTargeting>
    </PropertyGroup>
    

    安装NuGet包Microsoft.Windows.CsWinRT(版本需匹配你的Windows SDK版本)

  2. 编写控制代码:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:40:26