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

C#按键模拟程序切至其他窗口后停止运行问题咨询

问题现象
  • 为FPS瞄准训练编写的简易横移辅助脚本,核心逻辑为随机时长模拟按下键盘A/D键,模拟玩家左右横向移动效果
  • 脚本在自身控制台窗口处于前台激活状态时运行正常,切换至任意其他应用窗口后立刻停止运行
  • 开发依赖:Input Simulator NuGet包,原实现代码如下:
using System;
using WindowsInput.Native;
using WindowsInput;
using System.Threading;

namespace StrafeTrainer1
{
    internal class Program
    {

        static void Main(string[] args)
        {
            bool endthesuffering = true;

            ConsoleKeyInfo effSix = Console.ReadKey();
            if (effSix.Key == ConsoleKey.F6)
            {
                endthesuffering = false;
            }
            
            InputSimulator sim = new InputSimulator();
            
            Random randomD = new Random();
            Random randomT = new Random();

            while (endthesuffering == false)
            {

            int randomDirection = randomD.Next(0, 2); //Determines Strafe Direction
            int randomTime = randomT.Next(0, 800); //Determines Strafe Time
                
                if (randomDirection == 1)
                {
                    sim.Keyboard.KeyDown(VirtualKeyCode.VK_A);
                    Thread.Sleep(randomTime);
                    sim.Keyboard.KeyUp(VirtualKeyCode.VK_A);
                }
                else if (randomDirection == 0)
                {
                    sim.Keyboard.KeyDown(VirtualKeyCode.VK_D);
                    Thread.Sleep(randomTime);
                    sim.Keyboard.KeyUp(VirtualKeyCode.VK_D);
                }

                ConsoleKeyInfo effSeven = Console.ReadKey();
                if (effSeven.Key == ConsoleKey.F7)
                {
                    endthesuffering = true;
                }
                
            }

        }
    }
}
故障根本原因
  • 核心阻塞逻辑:代码中两处调用的Console.ReadKey()是阻塞式方法,仅当控制台窗口处于前台、持有输入焦点时,该方法才会捕获键盘输入并让程序继续向下执行。一旦切换到其他窗口,控制台失去输入焦点,Console.ReadKey()会直接挂起当前执行线程,整个循环卡住,自然无法继续发送模拟按键指令。
  • 逻辑设计缺陷:循环内每次执行完单次横移动作后,都会无前置判断直接调用Console.ReadKey()等待按键,就算控制台保持前台,每段横移结束后程序也会卡住等待输入,无法实现连续自动横移的预期效果。
  • 随机数实现问题:连续实例化两个Random对象时,由于默认无参构造函数以系统时钟滴答数作为随机种子,两个实例创建间隔极短会拿到完全相同的种子,最终生成高度重复的方向、时长序列,达不到随机移动的效果。
修复要点
  • 移除循环内阻塞式的Console.ReadKey()调用,改用非阻塞方式检测按键:先通过Console.KeyAvailable属性判断当前是否有可读取的按键输入,存在输入时再读取按键判断是否为F7退出键,避免线程在窗口失焦时卡住。如果需要在游戏窗口前台时也能响应热键,需要替换为全局键盘热键检测方案。
  • 删除冗余的Random实例,整个程序生命周期内仅保留一个随机数生成对象即可。
  • 调整循环执行逻辑,去掉单次横移后的强制等待步骤,保证横移动作可以连续循环执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:18:16