【问题标题】:Getting character attributes获取角色属性
【发布时间】:2015-02-04 04:01:04
【问题描述】:

使用 WinAPI 获取位于屏幕控制台的 y 行和 x 列的字符的属性。 这是我在调用GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &nativeData); 后尝试做的事情,其中​​控制台光标设置为指定位置。这行不通。它将返回上次使用的属性更改。

如何获取所有角色所在位置的属性?


编辑: 我用来测试的代码ReadConsoleOutput()http://hastebin.com/atohetisin.pl 它会抛出垃圾值。

【问题讨论】:

  • @JonathanPotter 也许是的,但我正在做一个巨大的项目,该项目将为控制台应用程序程序员的整个环境做出贡献,我不能浪费时间做错事(我不喜欢Windows 管理事物的方式)。最好的场景是有人说这是我需要的功能,并为我提供了一个如何使用它的示例,希望代码尽可能少。

标签: c windows winapi console


【解决方案1】:

我突然想到了几个问题:

  • 没有错误检查。如文档所述,您必须检查 ReadConsoleOutput 和其他函数的返回值。如果函数失败,您必须调用 GetLastError() 来获取错误代码。如果你不检查错误,你就瞎了眼。

  • 您没有分配缓冲区来接收数据。(当然,文档令人困惑地暗示它会为您分配缓冲区,但这显然是错误的,因为它无法返回指向它的指针.另外,示例代码清楚地表明您必须自己分配缓冲区。我添加了一个注释。)

  • 看起来好像您打算读取您所写的字符,但您正在写入 (10,5) 并从 (0,0) 读取。

  • 当您调用 ReadConsoleOutput 时,您传递的 newpos 设置为 (10,5),为 dwBufferCoord,但您指定的缓冲区大小为 (2,1)。目标坐标在缓冲区之外是没有意义的。

将最后两点放在一起,我想您可能对 dwBufferCoordlpReadRegion 感到困惑,但我不确定您的坐标 (200,50) 是什么意思。

  • 您将CHAR_INFO 解释为最终printf 语句中的整数。 CHAR_INFO 的第一个元素是字符本身,而不是属性。您可能想说chiBuffer[0].Attributes 而不仅仅是chiBuffer[0]。 (当然,目前这还没有实际意义,因为chiBuffer 指向一个随机内存地址。)

如果您确实要检索字符,您首先需要确定控制台是处于 Unicode 模式还是 ASCII 模式,并相应地检索 UnicodeChar 或 AsciiChar。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-27
    • 2022-07-24
    • 1970-01-01
    • 2022-01-14
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多