winapi - Hvordan tildeler Windows Display Device navne? (f.eks. \\. \ DISPLAY1) og bestemme displayporte?

Indlæg af Hanne Mølgaard Plasc

Problem



Vi skriver et program, der skal kunne skubbe indstillingen til specifikke skærme, hvilket kræver, at vi har unikke identifikatorer for hver displayenhed. Hidtil er det bedste, jeg kan få, at spørge et håndtag til DEVMODE struct returneret af EnumDisplayDevices og se, om det returnerede DISPLAY\_DEVICE navn indeholder enten 'DISPLAY1' eller 'DISPLAY2' (vi understøtter kun op til to skærme med denne software og enhedens navn feltet i DISPLAY\_DEVICE strukturen er i form af \. \ DISPLAYx, hvor x er et naturligt tal, mindst 1).


Mit problem er, at hvis nogen anvender indstillinger fra en terminal til en anden og siger 'får alle mine indstillinger fra DISPLAY1 og alle mine indstillinger fra min DISPLAY2 og anbringer dem til en anden terminal' s DISPLAY1 og DISPLAY2, 'gælder det indstillingerne til monitorerne tilsluttede de tilsvarende porte? Så vidt jeg kan fortælle, hvis der kun er 1 monitor tilsluttet, er denne skærm tildelt navnet \. \ DISPLAY1, og hvis der er to tilsluttede, er displayenheden tilsluttet via DVI er \. \ DISPLAY1 og enheden på VGA er \. \ DISPLAY2.


Jeg har forsøgt at afbryde monitorerne en ad gangen, genforbinde dem i forskellige ordrer, genstarte, genstarte med kun en tilsluttet, derefter forbinde et sekund osv. Osv., Og det synes altid at tildele dem på denne måde. Jeg kan ikke synes at gør det tildele dem de modsatte navne. Hvis dette er tilfældet, så skal vi være ok.


Alternativt, hvis nogen ved en måde at programmere bestemme hvilken port, som en skærm er tilsluttet (DVI eller VGA osv.) Ved hjælp af MSDN-opkald, ville det være endnu mere nyttigt. Jeg har udmattet stort set alle muligheder jeg kan tænke på i løsning af dette problem.


I grund og grund spørger jeg, jeg er korrekt i mine antagelser om, hvordan Windows 7 tildeler navne til skærmen? Hvis ikke, hvordan er det gjort? Er der en måde at ændre den på? Hvis ja, hvordan? Er der en måde at bestemme den port, som en skærm er tilsluttet til?


Forresten er denne ansøgning skrevet i C ++ ved hjælp af Qt, hvis det betyder noget.


Tak skal du have.


-Alex aka LeapDayWilliam

Bedste reference


Jeg synes, hvad du leder efter, er nogle kodeord, der hjælper dig med at knytte en skærms kanoniske navn med sin fysiske placering. Du ledte efter en løsning, hvor du kunne gøre denne bestemmelse ved at se på enhedens navne på skærmen, men det er ikke en præcis eller pålidelig måde at gøre det på. Fra min erfaring er der ingen rim eller grund til nummereringsordningen for navneapparatets navne. Hvad du virkelig har brug for, er en måde at bestemme, hvilken skærm der er fysisk placeret hvor.


Her er nogle meget grundlæggende kode til at udskrive X, Y-koordinaterne for den virtuelle pixelplacering for skærmen, du er interesseret i. Du vil bemærke, at hvis du har to (eller flere) skærme, vil X-værdien af ​​disse skærme øge baseret på skærmens bredde til venstre. Du kan beregne en skærms fysiske placering baseret på disse oplysninger.


    BOOL CALLBACK enumMonitorCallback(
  \_\_in  HMONITOR hMonitor,
  \_\_in  HDC hdcMonitor,
  \_\_in  LPRECT lprcMonitor,
  \_\_in  LPARAM dwData
)
{
    printf("Monitor: \%p (X,Y): (\%d,\%d) (Width, Height): (\%d,\%d) 
", hMonitor, lprcMonitor->left, lprcMonitor->top, lprcMonitor->right - lprcMonitor->left, lprcMonitor->bottom - lprcMonitor->top);
    return TRUE;
}

int \_tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;
    BOOL res = EnumDisplayMonitors(NULL, NULL, enumMonitorCallback, NULL);
    getchar();
    return nRetCode;
}


Min maskine har to skærme. Jeg får denne output:


    Monitor: 0x00C005E1 (X,Y): (0,0) (Width, Height): (1280,1024)
    Monitor: 0x00020001 (X,Y): (1280,0) (Width, Height): (1280,1024)


Som fortæller mig, at monitoren med håndtaget 0x00020001 er placeret til højre for den første skærm og modsvares af opløsningen af ​​den pågældende skærm (1280px).


Jeg håber det hjælper.