【问题标题】:EnumDisplayDevices does not return any valueEnumDisplayDevices 不返回任何值
【发布时间】:2015-10-01 09:12:29
【问题描述】:

我正在尝试枚举连接在多显示器系统上的所有显示器的详细信息。所以我参考了this 示例代码。以下是完整代码供参考:

#include <windows.h>
#include <stdio.h>

#pragma comment(lib, "user32.lib")

void DumpDevice(const DISPLAY_DEVICE& dd, size_t nSpaceCount )
{
    printf("%*sDevice Name: %s\n", nSpaceCount, "", dd.DeviceName );
    printf("%*sDevice String: %s\n", nSpaceCount, "", dd.DeviceString );
    printf("%*sState Flags: %x\n", nSpaceCount, "", dd.StateFlags );
    printf("%*sDeviceID: %s\n", nSpaceCount, "", dd.DeviceID );
    printf("%*sDeviceKey: ...%s\n\n", nSpaceCount, "", dd.DeviceKey+42 );
}

int main()
{
    DISPLAY_DEVICE dd;

    dd.cb = sizeof(DISPLAY_DEVICE);

    DWORD deviceNum = 0;
    while( EnumDisplayDevices(NULL, deviceNum, &dd, 0) ){
        DumpDevice( dd, 0 );
        DISPLAY_DEVICE newdd = {0};
        newdd.cb = sizeof(DISPLAY_DEVICE);
        DWORD monitorNum = 0;
        while ( EnumDisplayDevices(dd.DeviceName, monitorNum, &newdd, 0))
        {
            DumpDevice( newdd, 4 );
            monitorNum++;
        }
        puts("");
        deviceNum++;
    }

    return 0;
}

但是,当我运行此代码时,它会返回:

Device Name: \
Device String: N
State Flags: 5
DeviceID: P
DeviceKey: ...\

   Device Name: \
   Device String: V
   State Flags: 3
   DeviceID: M
   DeviceKey: ...\

Device Name: \
Device String: N
State Flags: 1
DeviceID: P
DeviceKey: ...\

Device Name: \
Device String: G
State Flags: 3
DeviceID: M
DeviceKey: ...\

Device Name: \
Device String: N
State Flags: 0
DeviceID: P
DeviceKey: ...\

Device Name: \
Device String: N
State Flags: 0
DeviceID: P
DeviceKey: ...\

而它返回了这个:

Device Name: \\.\DISPLAY1
Device String: NVIDIA GeForce GTX 580
State Flags: 8000005
DeviceID: PCI\VEN_10DE&DEV_1080&SUBSYS_15803842&REV_A1
DeviceKey: ...\Control\Video\{B0CDD262-FCFB-4FD4-A03C-54621896C9CD}\0000

   Device Name: \\.\DISPLAY1\Monitor0
   Device String: Generic PnP Monitor
   State Flags: 3
   DeviceID: MONITOR\DEL4016\{4d36e96e-e325-11ce-bfc1-08002be10318}\0002
   DeviceKey: ...\Control\Class\{4d36e96e-e325-11ce-bfc1-08002be10318}\0002

Device Name: \\.\DISPLAY2
Device String: NVIDIA GeForce GTX 580
State Flags: 0
DeviceID: PCI\VEN_10DE&DEV_1080&SUBSYS_15803842&REV_A1
DeviceKey: ...\Control\Video\{B0CDD262-FCFB-4FD4-A03C-54621896C9CD}\0001

Device Name: \\.\DISPLAYV1
Device String: RDPDD Chained DD
State Flags: 8
DeviceID:
DeviceKey: ...\Control\Video\{DEB039CC-B704-4F53-B43E-9DD4432FA2E9}\0000

Device Name: \\.\DISPLAYV2
Device String: RDP Encoder Mirror Driver
State Flags: 200008
DeviceID:
DeviceKey: ...\Control\Video\{42cf9257-1d96-4c9d-87f3-0d8e74595f78}\0000

Device Name: \\.\DISPLAYV3
Device String: RDP Reflector Display Driver
State Flags: 200008
DeviceID:
DeviceKey: ...\Control\Video\{b043b95c-5670-4f10-b934-8ed0c8eb59a8}\0000

对于提供此参考代码的用户

我在这里做错了什么?

【问题讨论】:

    标签: c++ windows msdn multiple-monitors


    【解决方案1】:

    我怀疑你的 unicode 有问题。

    看起来你的字符串只打印第一个 8 位字符,因为在你拥有的字符串中,字符是 16 位,下一个字节为零 - 所以 printf 决定它是字符串的结尾。

    在打印之前尝试将字符串从 unicode 转换为 ascii。

    【讨论】:

      猜你喜欢
      • 2014-06-17
      • 2015-05-20
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 2019-05-22
      相关资源
      最近更新 更多