6

私はキーボード入力を使用してボード上を移動するキャラクターを制御するばかげた端末ゲームを作成しています。ユーザーがキーを押すと、私のコードは を使用して正しく応答しますがgetChar、ユーザーが押した文字も端末に表示されます。ユーザーが入力したものを表示せずに、端末アプリでキーボード入力を受け取る方法はありますか?

編集: 私は Mac を使用していますが、すべてのプラットフォームについて知っておくとよいでしょう。

4

1 に答える 1

11

基本的に、目標を達成するために必要なことが 2 つあります。

  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 に答える