わたなべです.

ARIMA Yasuhiro <fit0298 / fitec.co.jp> writes:

:Win95 で作成しているのですが、getc が改行まで待ちになっているようでパスワードが
:丸見えというなさけない状態です。これはどのあたりが問題なのでしょうか?

getc は C の getc と同じなので, それで正常です.

Win32 の場合は Win32API module があるので, いろいろ方法はあ
ります. たとえば
 o crtdll.dll や msvcdll.dll の _getch を呼び出す.
 o coolview の cygwin.dll の getpass を呼ぶ
   (これが一番簡単. でも coolview 自体が beta 19 になっちゃったから…).
   Win32API.new('cygwin', 'getpass', ['P'], 'P').Call('Password: ')
 o cygwin32 をインストールして system('stty -echo'),
   system('stty echo') を使う. 酒本さんの minesweeper を参照.
 o cygwin.dll の tcgetattr, tcsetattr を使い gets する.
などなど. とりあえず 4 番目の方法を.

#こういう生の構造体が Struct とかで管理できると便利だなあ.

-- 
わたなべひろふみ

require 'Win32API' Tcgetattr = Win32API.new('cygwin', 'tcgetattr', %w(L P), 'V') Tcsetattr = Win32API.new('cygwin', 'tcsetattr', %w(L L P), 'V') ECHO = 4 TCSANOW = 2 C_LFLAG = 3 STRUCT_TERMIOS = 'SSSS C C18 CC' def tcgetattr fd, termios Tcgetattr.Call fd, termios end def tcsetattr fd, command, termios Tcsetattr.Call fd, command, termios end def getpass prompt ti = ([0]*25).pack(STRUCT_TERMIOS) tcgetattr 0, ti uti = ti.unpack(STRUCT_TERMIOS) uti[C_LFLAG] &= ~ECHO tcsetattr 0, TCSANOW, uti.pack(STRUCT_TERMIOS) $stderr.print prompt pass = $stdin.gets.chomp $stderr.puts tcsetattr 0, TCSANOW, ti pass end p = getpass('Password: ') puts p