6

我正在制作一个愚蠢的终端游戏,它使用键盘输入来控制一个角色在棋盘上移动。当用户按下一个键时,我的代码使用 正确响应getChar,但用户按下的字符也出现在终端中。有没有办法在终端应用程序中接收键盘输入,而不显示用户输入的内容?

编辑:我在 Mac 上,但很高兴在所有平台上都知道。

4

1 回答 1

11

基本上,要达到目标,您必须做两件事:

  1. 您必须禁用终端中的任何缓冲,以便您的程序立即获得按下的键(并且您不必使用 ENTER 确认)。

    hSetBuffering stdin NoBuffering
    
  2. 然后你必须确保字符不会回显到终端。

    hSetEcho stdin False
    

请注意,在您的程序退出之前,它必须恢复以前的设置,以便进一步使用终端。

将所有内容放在一起,代码将如下所示:

import System.IO
import Control.Exception (bracket)

withHiddenTerminalInput :: IO a -> IO a
withHiddenTerminalInput io = bracket
   (do prevBuff <- hGetBuffering stdin
       prevEcho <- hGetEcho stdin

       hSetBuffering stdin NoBuffering
       hSetEcho stdin False

       return (prevBuff, prevEcho)
   )

   (\(prevBuff, prevEcho) -> do
       hSetBuffering stdin prevBuff
       hSetEcho stdin prevEcho
   )

   (const io)
于 2013-04-06T10:17:44.697 回答