【问题标题】:How to get Keyboard inputs in native Swift? [duplicate]如何在本机 Swift 中获取键盘输入? [复制]
【发布时间】:2021-10-19 13:29:10
【问题描述】:

我正在尝试在 Mac OS 上以本机 swift(没有任何框架)制作命令行 Pong 游戏,我需要获取键盘输入。

我正在尝试做这样的事情: 例如,当我按下键盘上的“A”按钮时 该程序返回给我类似:“A press”。

在许多主题中,他们使用 SwiftUI/Cocoa ...但我不使用框架

谢谢

【问题讨论】:

  • 在 Mac 或 iOS 上?
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
  • 如何在不使用某些框架的情况下在屏幕上绘图?或者这是一个控制台纯文本应用程序? (您用于在屏幕上绘图的方式将指导您应该使用哪种输入工具。)您是在寻找“a 键”还是在寻找“将被标记为 A 的键在美国 QWERTY 键盘上?”例如,如果用户已将键盘布局配置为 AZERTY,您要查找哪个键? (“字符输入”的处理方式与“硬件键”不同)听起来您需要硬件键。
  • @RobNapier 这是一个命令行(纯文本)应用程序,我想要字符输入。非常感谢您的帮助
  • 我回答了这个问题,但意识到它实际上是 Martin R 的答案的副本,所以我在重复这个问题。如果您认为这个问题还有其他问题,请告诉我,我会重新打开它。

标签: swift


【解决方案1】:

您需要使用终端行规则 (termios) 进行调整,以关闭缓冲并在输入每个字符时为您提供。您可能还想关闭终端回声。

// You said no frameworks. But I'm guessing you'll accept libc.
import Darwin.libc

// Fetch the terminal settings
var term = termios()
tcgetattr(STDIN_FILENO, &term)

// Save them if you need to restore them later
var savedTerm = term

// Turn off canonical input (buffered) and echo
term.c_lflag &= ~(UInt(ICANON) | UInt(ECHO))

// Set the terminal settings immediately
tcsetattr(STDIN_FILENO, TCSANOW, &term)

// Now you can read a character directly
let c = getchar()

// It's an Int32 Unicode code point, so you may want to convert 
// it to something more useful
if let input = UnicodeScalar(Int(c)) {
    print("Got \(input)")
}

// Restore the settings if you need to. Most shells will do this automatically
tcgetattr(STDIN_FILENO, &savedTerm)

【讨论】:

  • 非常感谢它对我有用
猜你喜欢
  • 2017-02-24
  • 2015-07-06
  • 2022-01-22
相关资源
最近更新 更多