Seite 1 von 3
Monitor Name auslesen
Verfasst: 01.09.2014 19:52
von Hoto
Ich hab zwar einen Code gefunden, mit dem ich die Monitor Daten auslesen kann, der zeigt mir als Name aber nur die typische "\DISPLAY1" etc. an.
Wenn ich nun aber bei Windows in die "Bildschirmauflösung" gucke, dann erkennt Windows selbst viele Monitore direkt mit Namen. Kann man diesen per WinAPI auslesen? Konnte dazu leider nichts finden.
Und wie sicher ist es auf diese Art einen ganz bestimmten Monitor zu identifizieren?
Es geht im Prinzip darum einen bestimmten Monitor innerhalb eines beliebigen Multimonitor Setups zu erkennen um so zu wissen welcher Teil des Desktops auf diesem dargestellt wird.
Re: Monitor Name auslesen
Verfasst: 01.09.2014 21:43
von SBond
Hoto hat geschrieben:Es geht im Prinzip darum einen bestimmten Monitor innerhalb eines beliebigen Multimonitor Setups zu erkennen um so zu wissen welcher Teil des Desktops auf diesem dargestellt wird.
... könntest du das nicht über die Auflösung regeln?
Code: Alles auswählen
Desktops = ExamineDesktops()
For i=0 To Desktops-1
Text$ = "Desktop-Nummer: " + Str(i+1) + #CRLF$ + #CRLF$
Text$ + "Abmessung: " + Str(DesktopWidth(i)) + "*" + Str(DesktopHeight(i)) + #CRLF$
Text$ + "Farbtiefe: " + Str(DesktopDepth(i)) + " Bit" + #CRLF$
If DesktopFrequency(i) = 0
Text$ + "Frequenz: Standard" + #CRLF$ + #CRLF$
Else
Text$ + "Frequenz: " + Str(DesktopFrequency(i)) + " Hz" + #CRLF$ + #CRLF$
EndIf
Text$ + "Desktop-Name: " + DesktopName(i) + #CRLF$ + #CRLF$
Text$ + "Desptop X-Position: " + Str(DesktopX(i)) + " bis " + Str(DesktopX(i) + DesktopWidth(i)) + #CRLF$
Text$ + "Desptop Y-Position: " + Str(DesktopY(i)) + " bis " + Str(DesktopY(i) + DesktopHeight(i))
MessageRequester("Information", Text$)
Next
Der Haupmonitor ist meines wissens nach immer Desktop 1. Auf diesem befindet sich unter Windows die Taskleiste. Um nun zu erkennen welcher Monitor links oder rechts davon noch angeordnet ist, kann man einfach die Bereiche der Auflösung verwenden.
So ist es bei mir:
Code: Alles auswählen
Desktop-Nummer: 1
Abmessung: 1600*900
Farbtiefe: 32 Bit
Frequenz: 60 Hz
Desktop-Name: \\.\DISPLAY1
Desptop X-Position: 0 bis 1600
Desptop Y-Position: 0 bis 900
--> Hauptmonitor
Desktop-Nummer: 2
Abmessung: 1440*900
Farbtiefe: 32 Bit
Frequenz: 60 Hz
Desktop-Name: \\.\DISPLAY2
Desptop X-Position: -1440 bis 0
Desptop Y-Position: 0 bis 900
--> links vom Hauptmonitor, da der Desktopbereich negativ ist.
Einfache Regel: die linke obere Ecke deines Haupmonitors hat die absolute Position: 0x0. Mit dieser Info und dem Abmessung der Monitore, kann man genau die einzelnen Positionen bestimmen.
viele Grüße,
SBond
Re: Monitor Name auslesen
Verfasst: 01.09.2014 22:01
von Hoto
Bevor es um irgendwelche Alternativen geht hätte ich gerne mal die Hauptfrage beantwortet.
Im Grunde geht es mir erst mal darum prinzipiell eine Antwort darauf zu finden, ob das eindeutige Identifizieren geht oder nicht. Irgendwo her muss ja Windows den Namen haben, ist der eventuell in der Registry gespeichert? Da hab ich noch nicht gesucht, wäre ein Möglichkeit. Würde ja schon reichen, wenn ich auf die Weise dann das was PB als "\DISPLAYx" ausspuckt mit dem was in der Registry für die Monitore drin steht vergleichen könnte und somit den Namen eindeutig zuordnen kann.
Die Option, die du vorschlägst, geht nicht, die scheitert bereits bei meinem 3 Monitor Setup. So weiß ich dann nur was der primäre Bildschirm ist, aber dann hab ich immer noch 2 weitere und keine Ahnung welcher nur welcher ist, zumal alle 3 1080p haben.
Re: Monitor Name auslesen
Verfasst: 01.09.2014 22:26
von RSBasic
Über WinAPI kannst du die angeschlossenen Monitore mit
EnumDisplayDevices_() ermitteln. Diese Funktion ist mit der
DISPLAY_DEVICE-Struktur verknüpft. In dieser Struktur gibt es den Eintrag "DeviceKey". Damit bekommst du den Pfad zum Registry-Schlüssel des jeweiligen Monitors. Soweit ich weiß ist der Name des Monitors dort gespeichert. Hoffe ich mal.

Re: Monitor Name auslesen
Verfasst: 01.09.2014 22:31
von ts-soft
\DISPLAY1 bezeichnet den primären Monitor, d. h., der für die Taskbar zuständige.
Dies kann Monitor 1, 2, 3 oder ... sein. Bei mir ist es normalerweise Monitor 2.
Der Name läßt sich nicht einer \DISPLAY Bezeichnung zuordnen, jedenfalls nicht FIX, weil das änderbar ist!
Genauso muß der Name nicht bekannt sein, der wird meist mit dem Treiber bekanntgegeben, bzw. über DDI,
steht dann auch in der Registry.
Wenn also niemand den primären Monitor ändert und dessen Namen hat, kann er davon ausgehen, das dieser
\DISPLAY1 heißt, aber nur dann.
Ich denke mal, keine Chance auf sichere Identifizierung!
Gruß
Thomas
Re: Monitor Name auslesen
Verfasst: 01.09.2014 22:33
von RSBasic
ts-soft hat geschrieben:Ich denke mal, keine Chance auf sichere Identifizierung!
Doch eigentlich mit Hilfe der GUID, die man mit DISPLAY_DEVICE\DeviceKey bekommt.
Re: Monitor Name auslesen
Verfasst: 01.09.2014 22:37
von ts-soft
RSBasic hat geschrieben:Doch eigentlich mit Hilfe der GUID, die man mit DISPLAY_DEVICE\DeviceKey bekommt.
Aber nicht in bezug auf \DISPLAY?
Die läßt sich nämlich ändern, je nachdem wer primär ist.
Re: Monitor Name auslesen
Verfasst: 01.09.2014 22:39
von SBond
ich denke, der Gerätename gibt keinen Aufschluss darüber, welcher Monitor mit welcher Identifikation zugeordet wurde. Wo man die Namen einsehen kann, weiß ich nicht wirklich. WinAPI wird bestimmt die Infos geben können, aber die kenne ich nicht genau. Ob die Registrie eine gute Idee ist, glaube ich auch nicht. Hier brauchst du min. schonmal Adminrechte und ggf. eine Vendor-Nummer.
Mein Ansatz funktioniert übrigens auch mit mehreren Monitoren. Annahme: Du hast 4 Monitore: 4, 3, 1, 2
1 ist dein Hauptmonitor und alle Monitore besitzen die gleiche Auflösung. (in deinem Fall: 1080p)
dann wäre der horizontale Desktop-Bereich vom....
4. Monitor: -2160 bis -1079
3. Monitor: -1080 bis -1
1. Monitor: 0 bis 1079
2. Monitor: 1800 bis 2159
und wie gesagt, Hauptmonitor ist Nummer 1 (//Display1)
Edit: ich war wohl zu langsam

Re: Monitor Name auslesen
Verfasst: 01.09.2014 22:50
von ts-soft
Du kannst die Monitore hinpacken, wo Du willst. Deine Auflösung haut nur hin, wenn man die Monitore immer
gleich anordnet.
Ich kann also, mein \DISPLAY2, entspricht Monitor1, oberhalb, unterhalb, links oder rechts hinstellen. Entsprechend
dann die Auflösung:
0, -1080 oberhalb
0, 1080 unterhalb
1920, 0 links
1920, 1080 rechts
und auch alle Zwischenwerte sind möglich

Re: Monitor Name auslesen
Verfasst: 01.09.2014 22:51
von SBond
Code: Alles auswählen
Desktops = ExamineDesktops()
For i=0 To Desktops-1
x = (DesktopX(i) + (DesktopX(i) + DesktopWidth(i))) / 2
y = (DesktopY(i) + (DesktopY(i) + DesktopHeight(i))) / 2
OpenWindow(i, x-100, y-100, 200, 200, "Monitor: " + DesktopName(i), #PB_Window_SystemMenu)
Next
Repeat: Until WaitWindowEvent(10)=#PB_Event_CloseWindow
....hier teste mal
