2015-10-01 3 views
1

J'essaie d'énumérer les détails de tous les moniteurs connectés sur un système multi-moniteur. Donc, je me suis référé à this exemple de code. Voici le code complet de référence:EnumDisplayDevices ne renvoie aucune valeur

#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; 
} 

Cependant quand je lance ce code, il retourne ceci:

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: ...\ 

considérant qu'il est retourné ceci:

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 

pour l'utilisateur qui a fourni ce code de référence

Qu'est-ce que je fais mal ici?

Répondre

1

Je suppose que vous avez un problème avec unicode. Il semble que vos chaînes n'impriment que le premier caractère 8 bits, car dans les chaînes que vous avez, les caractères sont 16 bits et l'octet suivant a un zéro - alors printf décide que c'est la fin de la chaîne .

Essayant de convertir les chaînes d'unicode en ASCII avant de les imprimer.