2010-07-23 41 views
1

我一直在玩java和php(從頭開始)一些ANSI的東西(如顏色等),我試圖找到一種方式來基本上等待按鍵。我想我的主事件循環的末尾有類似下面的僞代碼:有沒有辦法等待並從(遠程)終端會話中獲取按鍵?

If (KeyPressed) 
Begin 
    var event = new KeyboardEvent(); 
     event.Key = ReadKey(); 
    this.BubbleEvent(event); 
End 

但一切我一直在努力,在過去幾天失敗,因爲鍵僅在標準輸入變得可用在用戶按下輸入之後。

這沒有多大意義的,你回答什麼語言,但javaphp,普通的舊cc#將是最好的,因爲我需要它移植到那些所有四個我不能使用任何真正漂亮的圖書館的東西語言...我需要這個工作通過telnetssh連接,但我的研究表明,除非你在本地機器上工作,否則這是不可能的。

請證明我是錯的。

回答

2

curses函數cbreak(3)將禁用行緩衝和擦除/終止處理。如果你真的想要,你可以用stty(1)自己做。

當程序死機並離開終端在cbreak模式時,您通常可以使用stty sanereset使終端回到合理的狀態。

在Perl中,您可以使用Term::ReadKeyCurses模塊來操作終端。有關詳細信息,請參閱Term::ReadKey(3pm)Curses(3pm)聯機幫助頁。

從C中,您可以使用終端設備上的ioctl(2)調用打開cbreak模式,也可以使用curses。有關詳細信息,請參閱ncurses(3)聯機幫助頁。

+0

謝謝,這聽起來很有用。我肯定會在週末檢查一下! – Kris 2010-07-23 07:07:33

+0

到目前爲止,運氣不好,因爲詛咒是一個我不能(也不想)依賴的圖書館,我無法弄清楚它是如何通過閱讀來源的詛咒。 (我不想學習C++只是爲了解決這個問題) – Kris 2010-07-23 21:59:25

1

我知道,這是一個古老的線程,但我無法在其他地方找到合適的答案。所以,從我公司的高級程序員一些幫助我想出了這一點:

private void waitKeypress() throws IOException 
{ 
    System.in.read(); 
    while (System.in.available() > 0) 
    { 
     System.in.read(); 
    } 
} 

的部分閱讀儘量廣泛可用解決了我的問題,多次使用時,「System.in.read() 「獨自並不總是等待。

對於我這樣做的伎倆,我用這樣的:

doSomething(); 
waitKeypress(); 
doNextThing(); 

希望它能幫助。

親切的問候, 拉爾夫

+0

雖然這不能解決我的問題(我不想等待一個鍵被按下),這可能對其他人訪問此線程有用。 – Kris 2011-10-15 08:44:56

相關問題