I'm trying to get the names of each of my monitors using DEVMODE.dmDeviceName
:
dmDeviceName
A zero-terminated character array that specifies the "friendly" name of the printer or display; for example, "PCL/HP LaserJet" in the case of PCL/HP LaserJet. This string is unique among device drivers. Note that this name may be truncated to fit in the dmDeviceName array.
I'm using the following code:
log.printf("Device Name: %s",currDevMode.dmDeviceName);
But for every monitor, the name is printed as just c
. All other information from DEVMODE seems to print ok. What's going wrong?
Most likely you are using the Unicode version of the structure and thus are passing wide characters to printf
. Since you use a format string that implies char
data there is a mis-match.
The UTF-16 encoding results in every other byte being 0 for characters in the ASCII range and so printf
thinks that the second byte of the first two byte character is actually a null-terminator.
This is the sort of problem that you get with printf
which of course has no type-safety. Since you are using C++ it's probably worth switching to iostream
based I/O.
However, if you want to use ANSI text, as you indicate in a comment, then the simplest solution is to use the ANSI DEVMODEA
version of the struct and the corresponding A
versions of the API functions, e.g. EnumDisplaySettingsA
, DeviceCapabilitiesA
.