将 C++ stdin 从键盘更改为另一个设备
Change C++ stdin from keyboard to another device
我读过 C++ 中的 std::cin
内容(我在这里转述)"takes input from the standard input stream, which is usually the keyboard"。
如何更改它以允许其他设备提供输入?我不知道我会用它来做什么,但我很好奇如何做到这一点。
(我确定答案就在那里,但搜索了一段时间后,我还没有找到;如果您知道可以回答我的问题的好资源,我将不胜感激如果你能让我知道它是什么。)
更新:除非我问的问题在普通 C++ 中是不可能的,否则这不是一个重复的问题。我不想将 stdin
/stdout
重定向到文件;我想知道是否可以将它重定向到其他设备,例如鼠标或游戏控制器。
您从其他输入设备读取的方式因设备而异。您必须在您使用的平台上使用 API; API在每个平台上都不同。
如果您真的很好奇,可以google 搜索 "C++ mouse input" 或 "C++ joystick input"(甚至 "C++ keyboard input" 用于低级键盘处理)以找到您正在寻找的详细信息。在搜索中添加 "Windows"、"Linux" 或 "Mac" 以查找适合您的特定平台的结果。
请注意,您可以在 Stack Exchange Game Development 站点上找到一些适合游戏开发的优秀低级设备控件。
WindowsAPIs
在 Windows 上,低级设备输入要求您使用 Windows 事件处理系统并处理您的应用所需的特定事件。 Microsoft 在 Windows Dev Center.
上记录了低级别 APIs
具体的API是:
- 键盘:Keyboard Input and Keyboard Input Notifications
- 鼠标:Mouse Input and Mouse Input Notifications
- 游戏控制器:DirectInput
Mac OS X
在 Mac 上处理低级输入事件与在 Windows 上不同,Mac 开发者库的文档通常出现在 Objective C 中,而不是 C++。值得注意的是,在 Mac OS X 上,XCode 将允许您编写名为 Objective C++ 的混合 C++/Objective C 代码,因此您可以轻松地利用您的 C++ 经验。
个人 API 是:
- 键盘:Handling Key Events
- 鼠标:Handling Mouse Events
- 游戏控制器:没有标准 API,但您可以在 Supporting Controllers on Mac and Using PS3 controller for input on Mac OSX
找到一些详细信息
Linux/*nix
Linux(和其他类 Unix 系统)可以支持 X11、KDE 或 Gnome GUI,因此它们都有自己的 API。我不会在这里列举它们,但是如果您想为 Linux、FreeBSD、OpenBSD 或任何其他 Unix 变体进行开发,您可以轻松找到适合您目的的 API。
抽象库/框架
有许多库 (C) 和框架 (C++) 为低级输入和输出提供跨平台接口。有些做得很好并得到广泛支持,并且通常有基于它们构建的游戏引擎。
一些非常常见且支持良好的库是:
还有可移植框架,通常用于开发更传统的应用程序,这些框架还提供了处理用户输入的抽象:
如果您稍加挖掘,就会发现很多很多可移植的库和框架。它们不仅通常使开发复杂逻辑变得更容易,而且您还可以在另一个平台上完全构建和 运行 代码,从而获得显着优势。
通常,您会在启动程序之前更改它。例如,标准输入可能来自一个文件:
./my_program </some/file/name
或来自另一个进程:
/some/other/program | ./my_program
您可以从程序中更改标准输入,但这几乎总是错误的做法,并且可能会让其他人感到惊讶¹。如果您正在编写需要执行输入的可重用代码,我建议您将输入流(或文件描述符,或者 FILE*
,如果您正在使用 C)传递到您的函数中,以允许外部如果需要,代码打开自己的文件(可能不止一个文件,也可能是管道或套接字...)
¹ "Someone else" 通常可以读作 "yourself in 6 months' time"...
我读过 C++ 中的 std::cin
内容(我在这里转述)"takes input from the standard input stream, which is usually the keyboard"。
如何更改它以允许其他设备提供输入?我不知道我会用它来做什么,但我很好奇如何做到这一点。
(我确定答案就在那里,但搜索了一段时间后,我还没有找到;如果您知道可以回答我的问题的好资源,我将不胜感激如果你能让我知道它是什么。)
更新:除非我问的问题在普通 C++ 中是不可能的,否则这不是一个重复的问题。我不想将 stdin
/stdout
重定向到文件;我想知道是否可以将它重定向到其他设备,例如鼠标或游戏控制器。
您从其他输入设备读取的方式因设备而异。您必须在您使用的平台上使用 API; API在每个平台上都不同。
如果您真的很好奇,可以google 搜索 "C++ mouse input" 或 "C++ joystick input"(甚至 "C++ keyboard input" 用于低级键盘处理)以找到您正在寻找的详细信息。在搜索中添加 "Windows"、"Linux" 或 "Mac" 以查找适合您的特定平台的结果。
请注意,您可以在 Stack Exchange Game Development 站点上找到一些适合游戏开发的优秀低级设备控件。
WindowsAPIs
在 Windows 上,低级设备输入要求您使用 Windows 事件处理系统并处理您的应用所需的特定事件。 Microsoft 在 Windows Dev Center.
上记录了低级别 APIs具体的API是:
- 键盘:Keyboard Input and Keyboard Input Notifications
- 鼠标:Mouse Input and Mouse Input Notifications
- 游戏控制器:DirectInput
Mac OS X
在 Mac 上处理低级输入事件与在 Windows 上不同,Mac 开发者库的文档通常出现在 Objective C 中,而不是 C++。值得注意的是,在 Mac OS X 上,XCode 将允许您编写名为 Objective C++ 的混合 C++/Objective C 代码,因此您可以轻松地利用您的 C++ 经验。
个人 API 是:
- 键盘:Handling Key Events
- 鼠标:Handling Mouse Events
- 游戏控制器:没有标准 API,但您可以在 Supporting Controllers on Mac and Using PS3 controller for input on Mac OSX 找到一些详细信息
Linux/*nix
Linux(和其他类 Unix 系统)可以支持 X11、KDE 或 Gnome GUI,因此它们都有自己的 API。我不会在这里列举它们,但是如果您想为 Linux、FreeBSD、OpenBSD 或任何其他 Unix 变体进行开发,您可以轻松找到适合您目的的 API。
抽象库/框架
有许多库 (C) 和框架 (C++) 为低级输入和输出提供跨平台接口。有些做得很好并得到广泛支持,并且通常有基于它们构建的游戏引擎。
一些非常常见且支持良好的库是:
还有可移植框架,通常用于开发更传统的应用程序,这些框架还提供了处理用户输入的抽象:
如果您稍加挖掘,就会发现很多很多可移植的库和框架。它们不仅通常使开发复杂逻辑变得更容易,而且您还可以在另一个平台上完全构建和 运行 代码,从而获得显着优势。
通常,您会在启动程序之前更改它。例如,标准输入可能来自一个文件:
./my_program </some/file/name
或来自另一个进程:
/some/other/program | ./my_program
您可以从程序中更改标准输入,但这几乎总是错误的做法,并且可能会让其他人感到惊讶¹。如果您正在编写需要执行输入的可重用代码,我建议您将输入流(或文件描述符,或者 FILE*
,如果您正在使用 C)传递到您的函数中,以允许外部如果需要,代码打开自己的文件(可能不止一个文件,也可能是管道或套接字...)
¹ "Someone else" 通常可以读作 "yourself in 6 months' time"...