2010-06-17 53 views
3

有什麼方法可以找回輸出到ncurses變量上的字符嗎?用ncurses獲取顯示屏中的文字

比方說我做的:

printw("test"); 

話,我希望能夠到:

somefunc(strbuffer); 
printf("%s",strbuffer); // test 

我需要一個函數來找回屏幕上的所有字符轉換爲一個變量,scr_dump得到的接近但輸出格式不可讀取。

+0

答案仍然正確,應該接受:-) – 2017-11-15 21:06:50

回答

9

如果你使用curses函數(例如addch,mvaddch,addstr)在屏幕上放東西,你可以使用inchstr)和相關函數來讀取e屏幕上的字符(使用A_CHARTEXT與返回的值進行AND操作來提取它們)。

但是,如果在屏幕上使用printf或任何其他非詛咒方法將文本放在屏幕上(包括系統調用另一個使用curses的程序),您將無法讀取屏幕內容。

Curses在內部維護當前屏幕內容,inchstr功能使用屏幕的內部表示來查找當前內容。

+0

謝謝,這正是我正在尋找的。 – Anon 2010-06-22 11:26:34

+4

@Anon,那麼你應該接受答案。 – 2011-03-03 12:35:31

0

有兩組函數用於從屏幕中檢索數據。如果您printw只使用(如問題),它表示爲8位編碼(ASCII,POSIX,ISO-8859-1),然後inchinchstr的工作文字:

  • inch檢索單個細胞與它的屬性一起
  • inchstr檢索多個單元以及它們的屬性

或更簡單地使用instr及其變化沿。這些函數可以返回數據,而無需額外掩蓋字符中的屬性。

但是,如果數據使用多字節編碼(例如UTF-8),則必須使用不同的接口來檢索字符。這些是inchinchstr等同:

複雜字符是一個結構,其中的X/Open詛咒對待爲不透明的。您必須使用getcchar從每個單元格的數據中提取數據(例如寬字符字符串)。

A(一點)更簡單地,可以讀取從一個窗口寬字符字符串信息:

總之,雖然應用程序可以把數據作爲char(或個人chtype值)的陣列,在UTF-8環境它必須檢索它作爲複雜字符寬字符。如果您恰好使用Linux,則通常可以將wchar_t視爲Unicode值。給定數據爲wchar_t值的數組,您可以使用其他(非詛咒)函數來獲取多字節(UTF-8)字符串。

由於提問時表示ncurses的而不是簡單地詛咒,這是適當地指出,使用ncurses的應用程序可以在他們把屏幕上的數據(這可能會影響你對預期的方式,從在X/Open詛咒不同檢索它)。在ncurses中,addch(和類似的char面向函數)將處理多字節字符串中的字節,如UTF-8,將結果存儲爲寬字符。迄今爲止,其他X/Open Curses實現都沒有這樣做。其他人將這些字節視爲獨立字節,並可能將它們表示爲無效的寬字符。

順便說一下,自2010年提問以來,ncurses的'scr_dump format已被擴展,使其「可讀」。