2014-12-05 101 views
-1

使用WinAPI獲取位於屏幕控制檯y行x列的字符屬性。 這是我在撥打GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &nativeData);後試圖執行的操作,其中控制檯光標被設置爲指定的位置。這不起作用。它將返回上次使用的屬性更改。獲取字符屬性

如何獲取在其位置上的所有字符上使用的屬性?


編輯: 我用來測試ReadConsoleOutput()的代碼:http://hastebin.com/atohetisin.pl 它將引發無用值。

+0

你看過http://msdn.microsoft.com/en-us/library/windows/desktop/ms685032(v=vs.85).aspx? – 2014-12-05 21:59:31

+0

@JonathanPotter也許是的,但我正在開發一個巨大的項目,它將貢獻控制檯應用程序員的整個環境,我不能浪費時間做錯了(我不喜歡Windows管理事物的方式)。最好的場景將會是有人說這是我需要的功能,併爲我提供了一個如何儘可能少使用代碼的例子。 – Protogrammer 2014-12-05 22:26:42

回答

1

我看到幾個問題把我的頭頂部:

  • 沒有錯誤檢查。如文檔所述,您必須檢查ReadConsoleOutput和其他函數的返回值。如果函數失敗,則必須調用GetLastError()來獲取錯誤代碼。如果你不檢查錯誤,你就會失明。

  • 你不會分配一個緩衝區來接收數據。(當然,文檔混淆意味着它會爲你分配緩衝區,但這顯然是錯誤的,因爲它無法返回指向它的指針。 )

  • 看起來好像您打算讀取您寫入的字符,但是您正在寫入(但是, 10,5)和從(0,0)中讀取。

  • 你傳遞newpos,被設置爲(10,5),作爲當你調用ReadConsoleOutput,但你指定的(2,1)的緩衝區大小。目標座標不在緩衝區之外是沒有意義的。

以最後兩分在一起,我想也許你已經和lpReadRegion困惑,雖然我不知道你的意思是座標(200,50)做。

  • 您正在將最終的printf聲明中的CHAR_INFO解釋爲整數。 CHAR_INFO的第一個元素是字符本身,而不是屬性。您可能想要說chiBuffer[0].Attributes而不僅僅是chiBuffer[0]。 (當然,這是目前無實際意義,因爲chiBuffer指向隨機內存地址。)

如果你要檢索的字符,您首先需要解決的控制檯是Unicode或ASCII模式,並相應地檢索UnicodeChar或AsciiChar。