dmDeviceName 只是'c'

dmDeviceName is just 'c'

本文关键字:只是 dmDeviceName      更新时间:2023-10-16

我正在尝试使用DEVMODE.dmDeviceName:获取每个监视器的名称

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

我使用以下代码:

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

但对于每个显示器,名称都打印为c。DEVMODE的所有其他信息似乎都打印正常。出了什么问题?

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

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

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

但是,如果要使用ANSI文本,如注释中所示,则最简单的解决方案是使用结构的ANSI DEVMODEA版本和API函数的相应A版本,例如EnumDisplaySettingsADeviceCapabilitiesA

dmDeviceNameTCHAR[],因此如果您为unicode进行编译,则第一个宽字符将被解释为'c',后跟一个零终止符。

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