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 implieschar
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 toiostream
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 correspondingA
versions of the API functions, e.g.EnumDisplaySettingsA
,DeviceCapabilitiesA
.