控制台应用程序的 C# 箭头键输入

2023-11-29

我有一个用 C# 编写的简单控制台应用程序。我希望能够检测箭头键按下情况,这样我就可以允许用户进行转向。如何使用控制台应用程序检测 keydown/keyup 事件?

我所有的谷歌搜索都找到了有关 Windows 窗体的信息。我没有图形用户界面。这是一个控制台应用程序(用于通过串行端口控制机器人)。

我编写了处理这些事件的函数,但我不知道如何注册以实际接收事件:

  private void myKeyDown(object sender, KeyEventArgs e)
  {
      switch (e.KeyCode)
      {
          case Keys.Left:
                 ...
          case Keys.Right:
                 ...
          case Keys.Up:
                 ...
      }
  }

  private void myKeyUp(object sender, KeyEventArgs e)
  {
      ... pretty much the same as myKeyDown
  }

这可能是一个非常基本的问题,但我对 C# 相当陌生,而且我以前从未需要过这种输入。

Update:很多人建议我使用System.Console.ReadKey(true).Key。这不会有帮助。我需要知道一个键被按下的时刻,何时释放,并支持同时按下多个键。此外,ReadKey 是一个阻塞调用——这意味着程序将停止并等待按下某个键。

Update:似乎唯一可行的方法是使用 Windows 窗体。这很烦人,因为我无法在无头系统上使用它。要求 Form GUI 接收键盘输入是......愚蠢的。

但无论如何,为了后代,这是我的解决方案。我在 .sln 中创建了一个新的 Form 项目:

    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            this.KeyDown += new KeyEventHandler(Form1_KeyDown);
            this.KeyUp += new KeyEventHandler(Form1_KeyUp);
        }
        catch (Exception exc)
        {
            ...
        }
    }

    void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        switch (e.KeyCode)
        {
            // handle up/down/left/right
            case Keys.Up:
            case Keys.Left:
            case Keys.Right:
            case Keys.Down:
            default: return;  // ignore other keys
        }
    }

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        // undo what was done by KeyDown
    }

请注意,如果您按住某个键,KeyDown 将被调用多次,而 KeyUp 将仅被调用一次(当您释放它时)。所以你需要优雅地处理重复的 KeyDown 调用。


现在有点晚了,但以下是如何在控制台应用程序中访问键盘状态。

请注意,它并不完全是所需的托管代码获取键状态从 User32.dll 导入。

/// <summary>
/// Codes representing keyboard keys.
/// </summary>
/// <remarks>
/// Key code documentation:
/// http://msdn.microsoft.com/en-us/library/dd375731%28v=VS.85%29.aspx
/// </remarks>
internal enum KeyCode : int
{
    /// <summary>
    /// The left arrow key.
    /// </summary>
    Left = 0x25,

    /// <summary>
    /// The up arrow key.
    /// </summary>
    Up,

    /// <summary>
    /// The right arrow key.
    /// </summary>
    Right,

    /// <summary>
    /// The down arrow key.
    /// </summary>
    Down
}

/// <summary>
/// Provides keyboard access.
/// </summary>
internal static class NativeKeyboard
{
    /// <summary>
    /// A positional bit flag indicating the part of a key state denoting
    /// key pressed.
    /// </summary>
    private const int KeyPressed = 0x8000;

    /// <summary>
    /// Returns a value indicating if a given key is pressed.
    /// </summary>
    /// <param name="key">The key to check.</param>
    /// <returns>
    /// <c>true</c> if the key is pressed, otherwise <c>false</c>.
    /// </returns>
    public static bool IsKeyDown(KeyCode key)
    {
        return (GetKeyState((int)key) & KeyPressed) != 0;
    }

    /// <summary>
    /// Gets the key state of a key.
    /// </summary>
    /// <param name="key">Virtuak-key code for key.</param>
    /// <returns>The state of the key.</returns>
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern short GetKeyState(int key);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

控制台应用程序的 C# 箭头键输入 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 在 ASP.NET 5 中使用 DI 调用构造函数时解决依赖关系

    Web 上似乎充斥着如何在 ASP NET 5 中使用 DI 的示例 但没有一个示例显示如何调用构造函数并解决依赖关系 以下只是众多案例之一 http social technet microsoft com wiki contents a
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • Netsuite 保存的搜索中的公式

    我这里有问题 在第 1 列中 我有所有交易的计数 在第 2 列中 我有特定状态的交易计数 在第 3 列中 我想要上面 2 的百分比 例如特定交易的计数 总数 在 Netsuite 中可以吗 实际上 有一个有趣的功能使这成为可能 当行上有聚合
  • 如何获得数组列表的不同结果?

    我有一个长类型数组的列表 List
  • 用户集合中所有用户的列表第一次使用 Meteor JS 时不工作

    我在列出用户集合中的所有用户时遇到问题 当我进入列表页面时 仅显示当前登录用户的详细信息 但是 一旦页面刷新 所有用户都会被列出 这样就可以了 在服务器端 我有以下发布代码 Meteor publish userList function
  • 区分空对象类型和其他具体类型

    所有这些都编译没有错误 interface Empty interface MaybeEmpty a number var one Object 20 var two Empty 21 var three 22 var four Maybe
  • 在 Java 中观察目录的变化

    我想监视目录中的文件更改 我在java nio中使用了WatchService 我可以成功监听文件创建事件 但我无法监听文件修改事件 我检查了官方java教程 但仍在挣扎 这是源代码 import static java nio file
  • 防止范围内的项目写入不同用户的记录

    我在应用程序中有一个用户的场景中成功使用了 AngularFire 现在我已经启动并运行了身份验证 我注意到分配items to scope items切换用户时是灾难性的 主要是由于 scope无法正确更新 直接从文档中阅读 var re
  • 安卓蓝牙开启

    我正在开发一个蓝牙聊天应用程序 问题是 当我启用蓝牙时 应用程序启用蓝牙但会导致强制关闭 下次我启动相同的应用程序 启用蓝牙 时 它运行顺利 我已经搜索过 只得到一些信息 说当我启动启用蓝牙的意图时 代码会继续执行 而不等待意图的结果 pu
  • 如何将 `$this` 绑定到 PHP 函数?

    对于 JavaScript 我们可以执行这样的操作将作用域绑定到所需的函数 function myFunction alert this foo var MyClass function this foo 1 var c new MyCla
  • Flask:如何避免为特定 URL 生成任何类型的答案

    我正在为家庭自动化编程一个家庭网络服务器 我曾多次看到 机器人 扫描我的服务器端口 为了避免给不需要的扫描提供任何类型的活动标志 我试图避免为特定 URL 生成任何类型的答案 例如 即 为典型扫描的 URL 配置静默模式 我尝试过使用 vo
  • 函数的结果总是被初始化吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Delphi中Result的默认值是多少 如同这个问题 我现在问以下问题 function Test Boolean begin end 是结果值always保证为假 0 整数值不是 布尔值也不是吗
  • 尝试加载 swf 文件时在 IE 中出现 c00ce514 错误

    我在 each 循环中有以下 ajax 调用 它从服务器加载多个 swf 文件 ajax url src a variable containing the url of the swf file success function succ
  • 如果单词在 pandas 的特定列中,如何获取一个片段出现的次数?

    我将尝试用一个简单的例子来描述我的问题 我有一个包含许多列的 csv 文件 该列的标题之一是 名称 在 名称 这一列中 我只需要重复名称 John 的次数 例如 我的 名称 列如下 names John John M Mike John A
  • 从独立应用程序轮询 GMail 收件箱中传入邮件的正确方法

    我正在尝试轮询 GMail 收件箱以获取传入邮件 这是我所拥有的 import java util Properties import javax mail Authenticator import javax mail Folder im
  • 如何比较大的 JSON?

    有 2 个通过代码从同一源创建的大 JSON GB 文件 它们的工作原理应该完全相同 但有时应该存在一些细微的差异 想要确保两次转换都完成了相同的工作并且正确 制作了一个小项目 将 JSON 转换为 CSV 类型 并包含元素及其内容 单值或
  • Haskell 猜牌游戏

    我正在编写一个猜牌游戏 用户设置答案并让电脑猜测 对于我的项目 输入卡号是2 然后 我需要编写猜牌算法 我已经创建了卡片模块 data Suit Club Diamond Heart Spade deriving Eq Ord Bounde
  • 如何将 xml 编码 添加到 SQL Server 中的 xml 输出

    可能是未答复的重复 SQL Server 2008 将 XML 声明添加到 XML 输出 请告诉我这是否可行 我在一些博客中读到 http forums asp net t 1455808 aspx 1 http www devnewsgr
  • 由yarn (MRv2) 或mapred (MRv1) 以外的用户提交时,Hadoop 作业会失败

    我正在运行一个与 LocalFileSystem 配对运行 MRv1 CDH5 的测试集群 并且我唯一能够运行作业的用户是 mapred 因为 mapred 是启动 jobtracker tasktracker 守护进程的用户 以任何其他用
  • 使用 Python 从 Excel 电子表格中读取 VBA

    我想用 最好是 Python 编写一个 VBA diff 程序 是否有一个 Python 库可以让我读取 Excel 电子表格中包含的 VBA 这里有一些快速但肮脏的样板文件可以帮助您入门 它使用 Excel COM 对象 仅限 Windo
  • 如何在 SCNShere 几何体上使用 SCNMaterial 的 Web 墨卡托投影图?

    我的应用程序中有一个简单的地球视图 之前我们使用 WhirlyGlobe 但现在选择使用 SceneKit 一切都很好 我们对此很满意 除了我们在 Whirly Globe 中使用了地图图块 而在 SceneKit 中不起作用 据我所知 我
  • 控制台应用程序的 C# 箭头键输入

    我有一个用 C 编写的简单控制台应用程序 我希望能够检测箭头键按下情况 这样我就可以允许用户进行转向 如何使用控制台应用程序检测 keydown keyup 事件 我所有的谷歌搜索都找到了有关 Windows 窗体的信息 我没有图形用户界面