2

我正在尝试使用以下方法获取每个显示器的名称DEVMODE.dmDeviceName

dmDeviceName
一个以零结尾的字符数组,指定打印机或显示器的“友好”名称;例如,在 PCL/HP LaserJet 的情况下为“PCL/HP LaserJet”。此字符串在设备驱动程序中是唯一的。请注意,此名称可能会被截断以适合 dmDeviceName 数组。

我正在使用以下代码:

log.printf("Device Name: %s",currDevMode.dmDeviceName);

但是对于每台显示器,名称都打印为c. 来自 DEVMODE 的所有其他信息似乎都可以打印。怎么了?

4

2 回答 2

4

您很可能正在使用结构的 Unicode 版本,因此将宽字符传递给printf. 由于您使用暗示char数据的格式字符串,因此存在不匹配。

对于 ASCII 范围内的字符,UTF-16 编码导致每隔一个字节为 0,因此printf认为前两个字节字符的第二个字节实际上是一个空终止符。

这是您遇到的那种问题,printf当然没有类型安全性。由于您使用的是 C++,因此可能值得切换到iostream基于 I/O。

但是,如果您想使用 ANSI 文本,正如您在评论中指出的那样,那么最简单的解决方案是使用 ANSIDEVMODEA版本的结构和相应A版本的 API 函数,EnumDisplaySettingsA例如DeviceCapabilitiesA.

于 2011-10-17T10:06:16.683 回答
2

dmDeviceName因此TCHAR[],如果您正在为 unicode 编译,第一个宽字符将被解释为 'c' 后跟零终止符。

您需要将其转换为 ascii 或使用支持 unicode 的打印例程。

于 2011-10-17T10:06:39.720 回答