将c++标准输入从键盘更改为另一个设备

Change C++ stdin from keyboard to another device

本文关键字:另一个 c++ 标准输入 键盘      更新时间:2023-10-16

我读到过c++中的std::cin(我在这里转述)"从标准输入流中获取输入,通常是键盘"。

如何改变它以允许其他设备提供输入?我不知道我会用它做什么目的,但我很好奇如何做到这一点。

(我确信答案在某个地方,但搜索了一段时间后,我还没有找到它;如果你知道一个很好的资源可以回答我的问题,我将非常感激,如果你能告诉我它是什么。

更新:除非我问的问题在正常的c++中是不可能的,否则这不是一个重复的问题。我不希望将stdin/stdout重定向到文件;我想知道是否有可能将它重定向到其他设备,如鼠标或游戏控制器

从其他输入设备读取的方式是特定于设备的。你必须使用你正在使用的平台上的api;每个平台上的api是不同的。

如果你真的很好奇,你可以谷歌搜索"c++鼠标输入"或"c++操纵杆输入"(甚至是"c++键盘输入",用于低级键盘处理)来找到你想要的细节。在搜索中添加"Windows"、"Linux"或"Mac",可以找到适合你的特定平台的结果。

注意,你可以在Stack Exchange game development网站上找到一些优秀的低级设备控制,适合游戏开发。

Windows api

在Windows上,低级设备输入要求你使用Windows事件处理系统,并处理你的应用程序需要的特定事件。Microsoft在Windows Dev Center上记录了底层api。

具体的api有:

  • 键盘:键盘输入和键盘输入通知
  • 鼠标:鼠标输入和鼠标输入通知
  • 游戏控制器:DirectInput

Mac OS X

在Mac上处理低级输入事件与在Windows上不同,Mac Developer Library上的文档通常是用Objective C而不是c++呈现的。值得注意的是,在Mac OS X上,XCode将允许你编写c++/Objective C的混合代码,称为Objective c++,所以你可以很容易地利用你的c++经验。

单个api如下:

  • 键盘:处理关键事件
  • 鼠标:处理鼠标事件
  • 游戏控制器:没有标准的API,但你可以在Mac上的支持控制器和Mac OSX上使用PS3控制器输入中找到一些细节
Linux/* nix

Linux(和其他类unix系统)可以支持X11、KDE或Gnome gui,因此这些gui都有自己的api。我不会在这里列举它们,但是如果你想为Linux、FreeBSD、OpenBSD或任何其他Unix变体开发,你可以很容易地找到适合你的api。

抽象库/框架

有许多库(C)和框架(c++)为低级输入和输出提供跨平台接口。有些做得很好,得到了广泛的支持,并且经常有游戏引擎构建在它们之上。

一些非常常见且支持良好的库有:

  • Simple DirectMedial Layer (SDL)
  • 快板
  • GLFW
  • SFML

还有一些可移植的框架,通常用于开发更传统的应用程序,这些框架还提供了处理用户输入的抽象:

  • wxWidgets(原wxWindows)
  • Qt
  • JUCE
  • 终极+ +

如果你稍微挖掘一下,你可以找到很多很多可移植的库和框架。它们不仅通常使开发复杂逻辑变得更容易,而且还将使您的代码完全在另一个平台上构建和运行具有显著的优势。

通常,您在启动程序之前更改它。例如,标准输入可能来自文件:

./my_program </some/file/name

或从另一个进程:

/some/other/program | ./my_program

可以在程序中更改stdin,但这几乎总是错误的做法,并且会使从事该工作的其他人感到惊讶¹。如果您正在编写需要执行输入的可重用代码,我建议您将输入流(或文件描述符,或FILE*,如果您使用C)传递到您的函数中,以允许外部代码打开自己的文件,如果它想要(可能不止一个文件,也可能是管道或套接字…)


¹"别人"通常可以理解为"6个月后的自己"…

相关文章: