如何用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
相关产品推荐
相关产品推荐

