【问题标题】:Failed to retrieve "console font-size" using "GetCurrentConsoleFont()" in "Windows XP"?在“Windows XP”中使用“GetCurrentConsoleFont()”检索“控制台字体大小”失败?
【发布时间】:2013-11-21 12:42:35
【问题描述】:

我用 GCC mingw32 编译了这段代码,没有任何错误和警告:

#define WINVER 0x0500
#include <windows.h>
HWND StdHandle = GetStdHandle (STD_OUTPUT_HANDLE);
CONSOLE_FONT_INFO GETFONT;
GetCurrentConsoleFont (StdHandle, FALSE, &GETFONT);
if (GETFONT.dwFontSize.X != 8 || GETFONT.dwFontSize.Y != 12)
  printf ("Font-Size is not 8 x 12");
else
  printf("Font-Size is 8 x 12");

它在 Windows 7 中完美运行。

但是,当它在 Windows XP 中运行并且我将控制台字体大小调整为“8 x 12”时,GETFONT.dwFontSize.X 始终等于 80,GETFONT.dwFontSize.Y 始终等于 25。

然后,我添加了

DWORD ErrorCode = GetLastError();

而且,它返回0x0 (ERROR_SUCCESS(:The operation completed successfully.))

为什么在 Windows XP 中使用 GetCurrentConsoleFont 时总是得到错误的值?

【问题讨论】:

  • 您根本没有执行任何错误检查。您需要检查您调用的函数的返回值。不要只打电话给GetLastError。只有在 MSDN 文档说它有意义时才这样做。
  • OT (?):针对 XP 使用:#define WINVER 0x0501! 0x0500 是 Windows 2000,GetCurrentConsoleFont() 可用。供参考:msdn.microsoft.com/en-us/library/vstudio/6sehtctf.aspx
  • @alk THX 为您提供关于将 0x0500 更改为 0x0501 的建议。而我刚刚找到了这个问题的完美解决方案:
  • 此更改是否解决了问题?
  • @alk 不是,但谢谢。我在哪里可以发布此问题的解决方案?适合回答我自己的问题吗?

标签: c winapi console-application mingw32


【解决方案1】:

关于 CONSOLE_FONT_INFO 的 MSDN 文档说

要获取字体的大小,请将字体索引传递给 GetConsoleFontSize 函数。

【讨论】:

  • 但是,为什么不能只使用GetCurrentConsoleFont()?它还可以通过传递一个指向 CONSOLE_FONT_INFO 结构的指针来获取 font-size 的值。不是吗?
  • 我不知道。有趣的是CONSOLE_FONT_INFOGetConsoleFontSize 的两个页面都说完全相同的事情。你可以在 MS Connect 上开一张票,或者你可以写一个 if 就可以了。
【解决方案2】:
BOOL WINAPI GetCurrentConsoleFont (HANDLE hConsoleOutput, BOOL bMaximumWindow, PCONSOLE_FONT_INFO lpConsoleCurrentFont);
COORD WINAPI GetConsoleFontSize (HANDLE hConsoleOutput, DWORD nFont);

CONSOLE_FONT_INFO GETFONT;
GetCurrentConsoleFont (StdHandle, FALSE, &GETFONT);
COORD Fontsize = GetConsoleFontSize (StdHandle, GETFONT.nFont);
SHORT Font_X = Fontsize.X;
SHORT Font_Y = Fontsize.Y;
if (Font_X != 8 || Font_Y != 12)
{
     printf ("Font-Size is not 8 x 12");
}

【讨论】:

  • 请尝试解释这一点,而不仅仅是向我们扔代码。当它似乎只提供 edokan 的答案时,为什么要添加它?请注意我所说的关于错误检查的内容。你什么都不做!
  • @David Heffernan 哦,我知道。但是...,我刚学了 1 个月的 C 语言,和 3 天的 Windows API。而且……我只是一个13岁的学生。请给我几天时间来提高这段代码的质量。感谢您对错误检查的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多