2014-12-05 96 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。