Monitor Name auslesen
Monitor Name auslesen
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.
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
... könntest du das nicht über die Auflösung regeln?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.
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
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.
viele Grüße,
SBond
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

Re: Monitor Name auslesen
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.
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
Ü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. 
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Monitor Name auslesen
\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
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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Monitor Name auslesen
Doch eigentlich mit Hilfe der GUID, die man mit DISPLAY_DEVICE\DeviceKey bekommt.ts-soft hat geschrieben:Ich denke mal, keine Chance auf sichere Identifizierung!
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Monitor Name auslesen
Aber nicht in bezug auf \DISPLAY?RSBasic hat geschrieben:Doch eigentlich mit Hilfe der GUID, die man mit DISPLAY_DEVICE\DeviceKey bekommt.
Die läßt sich nämlich ändern, je nachdem wer primär ist.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Monitor Name auslesen
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
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
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Monitor Name auslesen
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
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
Zuletzt geändert von ts-soft am 01.09.2014 22:52, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: Monitor Name auslesen
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
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e


