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

如何用UWP应用实现虚拟按住键盘W键以规避AFK惩罚?

实现游戏中按住W键防AFK的方案(基于Windows.UI.Input.Preview.Injection)

前提配置

首先需要在你的UWP应用的Package.appxmanifest中添加输入注入权限,否则API无法正常工作:

<Capabilities>
  <Capability Name="internetClient" />
  <uap3:Capability Name="inputInjectionBrokered" />
</Capabilities>

核心实现步骤

Windows.UI.Input.Preview.Injection的核心是通过InputInjector模拟键盘输入事件。要实现按住W键的效果,需依次发送按键按下和按键释放事件;若要持续按住,可通过循环维持按下状态。

以下是完整的C#代码示例:

using Windows.UI.Input.Preview.Injection;
using System.Threading.Tasks;

public class AntiAFKHelper
{
    private InputInjector _injector;
    private bool _isHoldingW = false;

    public AntiAFKHelper()
    {
        // 初始化输入注入器(必须用TryCreate,直接实例化会失败)
        _injector = InputInjector.TryCreate();
    }

    // 开始按住W键
    public async Task StartHoldingW()
    {
        if (_injector == null || _isHoldingW) return;

        _isHoldingW = true;

        // 发送W键按下事件
        var downEvent = new InjectedInputKeyboardInfo();
        downEvent.VirtualKey = (ushort)Windows.System.VirtualKey.W;
        _injector.InjectKeyboardInput(new[] { downEvent });

        // 持续维持按住状态(示例每1秒重复发送按下事件,防止游戏判定输入中断)
        while (_isHoldingW)
        {
            await Task.Delay(1000);
            _injector.InjectKeyboardInput(new[] { downEvent });
        }

        // 发送W键释放事件
        var upEvent = new InjectedInputKeyboardInfo();
        upEvent.VirtualKey = (ushort)Windows.System.VirtualKey.W;
        upEvent.KeyOptions = InjectedInputKeyOptions.KeyUp;
        _injector.InjectKeyboardInput(new[] { upEvent });
    }

    // 停止按住W键
    public void StopHoldingW()
    {
        _isHoldingW = false;
    }
}

关键说明

  • InputInjector.TryCreate():必须通过此方法创建实例,直接new会因为权限验证失败而报错。
  • 按键事件区分:按下事件仅需指定VirtualKey;释放事件必须添加InjectedInputKeyOptions.KeyUp标记。
  • 持续输入逻辑:部分游戏会检测输入连续性,定时重复发送按下事件可避免被判定为无效输入。
  • 权限适配:如果是桌面桥接应用(如MSIX打包的Win32程序),同样需要添加上述权限,并确保应用拥有足够系统权限。

替代方案(API被拦截时)

若UWP API在部分游戏中被拦截,可使用Win32的SendInput API,兼容性更广:

using System.Runtime.InteropServices;

public class Win32AntiAFKHelper
{
    [DllImport("user32.dll", SetLastError = true)]
    private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

    [StructLayout(LayoutKind.Sequential)]
    private struct INPUT
    {
        public uint type;
        public InputUnion u;
    }

    [StructLayout(LayoutKind.Explicit)]
    private struct InputUnion
    {
        [FieldOffset(0)] public KEYBDINPUT ki;
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct KEYBDINPUT
    {
        public ushort wVk;
        public ushort wScan;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }

    private const uint INPUT_KEYBOARD = 1;
    private const uint KEYEVENTF_KEYUP = 0x0002;

    public static void PressW()
    {
        INPUT[] inputs = new INPUT[1];
        inputs[0].type = INPUT_KEYBOARD;
        inputs[0].u.ki.wVk = (ushort)ConsoleKey.W;
        SendInput(1, inputs, Marshal.SizeOf(typeof(INPUT)));
    }

    public static void ReleaseW()
    {
        INPUT[] inputs = new INPUT[1];
        inputs[0].type = INPUT_KEYBOARD;
        inputs[0].u.ki.wVk = (ushort)ConsoleKey.W;
        inputs[0].u.ki.dwFlags = KEYEVENTF_KEYUP;
        SendInput(1, inputs, Marshal.SizeOf(typeof(INPUT)));
    }
}

内容的提问来源于stack exchange,提问作者user20418903

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:30:47