Page 1 sur 1
[..] Récupérer les noms des écrans
Posté : mar. 23 sept. 2014 23:55
par TommyDDR
Bonjour,
Ce n'est pas vraiment une demande d'aide mais plutôt une demande de test, je me torture l'esprit pour trouver les noms d'écrans en fonction du device number.
J'en suis arrivé au code ci dessous, et j'aimerai que vous le testiez et me disiez si vous trouvez tous le/les bons noms d'écrans.
Résultats de la forme :
Écran n°1 : XXXX | XXXX
Écran n°2 : YYYY | YYYY
etc
(deux fois les mêmes valeurs par ligne, si vous n'en avez qu'une ou 0 merci de me l'indiquer)
Pour connaitre le nom de son écran :
Win XP : Il n'affiche pas le vrai nom, je n'ai donc pas besoin de tests sous XP
Win 7/8 : Clic droit / Résolution d'écran
Le plus simple est de lancer le script, faire Ctrl + c dans la MsgBox et de le coller ici
► Afficher le textecode
Code : Tout sélectionner
#include <WinAPI.au3>
Local $txt
For $i = 0 To _MonitorGetCount()-1
$txt &= "Écran n°" & $i+1 & " : " & _MonitorGetName($i) & " | " & _MonitorGetName(_MonitorGetIdByNumber($i)) & @LF
Next
MsgBox(0, "", $txt)
Func _MonitorGetCount()
Local $count = 0
While(True)
Local $displayDevice = _WinAPI_EnumDisplayDevices("", $count)
If(Not(IsArray($displayDevice)) Or BitAND($displayDevice[3], 1) = 0) Then ExitLoop
$count += 1
WEnd
Return $count
EndFunc
Func _MonitorGetName($pathId)
Local $name = ""
If(StringIsDigit($pathId)) Then $pathId = _MonitorGetIdByNumber($pathId)
If(Not(StringInStr($pathId, "?"))) Then $pathId = _MonitorGetIdByDisplayName($pathId)
If(StringLen($pathId) > 0) Then
Local $regId = StringSplit($pathId, "\", 3)
$regId = StringReplace($regId[UBound($regId, 1)-1], "#", "\")
$regId = StringSplit($regId, "{", 3)[0]
$name = _MonitorGetNameByRegId($regId)
EndIf
Return $name
EndFunc
Func _MonitorGetIdByDisplayName($displayName)
Local $retour = ""
Local $displayDevice = _WinAPI_EnumDisplayDevices($displayName, 0)
If(IsArray($displayDevice)) Then
$retour = $displayDevice[4]
EndIf
Return $retour
EndFunc
Func _MonitorGetIdByNumber($number)
Local $retour = ""
Local $displayDevice = _WinAPI_EnumDisplayDevices("", $number)
If(IsArray($displayDevice)) Then
$retour = _MonitorGetIdByDisplayName($displayDevice[1])
EndIf
Return $retour
EndFunc
Func _MonitorGetNameByRegId($regId)
Local $retour = ""
Local $edid = RegRead("HKLM64\SYSTEM\CurrentControlSet\Enum\" & $regId & "\Device Parameters", "EDID")
$edid = StringSplit($edid, "000000FC00", 3)
If(UBound($edid, 1) > 1) Then
$edid = StringSplit($edid[1], "0A", 3)[0]
$retour = BinaryToString("0x" & $edid)
EndIf
Return $retour
EndFunc
Merci par avance.
Re: [..] Récupérer les noms des écrans
Posté : mer. 24 sept. 2014 00:03
par orax
Alors j'ai 2 écrans. Le BenQ c'est bien le 1er. Je n'ai pas de Msgbox qui s'affiche pour le second. Testé sur Win7.
Re: [..] Récupérer les noms des écrans
Posté : mer. 24 sept. 2014 01:11
par overflow
Code : Tout sélectionner
$regId = StringSplit($regId, "{", 3) ;[0]
$name = _MonitorGetNameByRegId($regId[0])
$edid = StringSplit($edid[1], "0A", 3);[0]
$retour = BinaryToString("0x" & $edid[0])
---------------------------
---------------------------
Écran n°1 : ZM-M240W | ZM-M240W
Écran n°2 : SAMSUNG | SAMSUNG
---------------------------
OK
---------------------------
je ne sais pas comment tu classe les ecrans
le moniteur identifier 1 par ma carte graphique c est le samsung et l asus le 2
Re: [..] Récupérer les noms des écrans
Posté : mer. 24 sept. 2014 01:23
par TommyDDR
L'ordre est celui de _WinAPI_EnumDisplayDevices (un élément de l'array permet de savoir si c'est l'écran principal)
@orax : _MonitorGetCount() renvoie bien 2 ?
Re: [..] Récupérer les noms des écrans
Posté : mer. 24 sept. 2014 01:44
par orax
Non, _MonitorGetCount() renvoie 1. J'ai vérifié dans le registre et c'est bien 1 que j'ai.
Sur la carte graphique intégrée j'ai le Benq (sur le port DVI) et un Liteon (sur le port VGA).
Édité : Le Liteon (l'écran secondaire) est vu comme
PnP-Monitor (Standard) dans le gestionnaire de périphériques. De plus, il n'y a pas d'ID qui est récupéré pour cet écran.
Code : Tout sélectionner
$aDevice = _WinAPI_EnumDisplayDevices('\\.\DISPLAY2', 0) ; Le Liteon
; $aDevice[1] = "\\.\DISPLAY2\Monitor0"
; $aDevice[2] = "PnP-Monitor (Standard)"
; $aDevice[4] = ""
Re: [..] Récupérer les noms des écrans
Posté : mer. 24 sept. 2014 02:29
par TommyDDR
Je n'ai plus qu'à chercher un autre moyen de compter les moniteurs..
EDIT :
► Afficher le textecode
Code : Tout sélectionner
Func _MonitorGetCount()
Local $count = 0
While(True)
Local $displayDevice = _WinAPI_EnumDisplayDevices("", $count)
If(Not(IsArray($displayDevice)) Or BitAND($displayDevice[3], 1) = 0) Then ExitLoop
$count += 1
WEnd
Return $count
EndFunc
Re: [..] Récupérer les noms des écrans
Posté : mer. 24 sept. 2014 02:41
par orax
Là j'ai bien 2. ^^
Re: [..] Récupérer les noms des écrans
Posté : mer. 24 sept. 2014 08:32
par jguinch
Regarde le post #5, ça pourrait te convenir :
http://www.autoitscript.com/forum/topic ... ?p=1199697
Et le post #7 pour compter le nombre d'écrans
Edit
Sinon, pour répondre à ta question d'origine, j'ai le résultat suivant, qui correspond bien à ma config (en même temps, c'est les 2 mêmes écrans) :
Re: [..] Récupérer les noms des écrans
Posté : mer. 24 sept. 2014 11:32
par TommyDDR
@orax : avec les bon noms ? :3
@jguinch : merci, je vais voir ça ce soir

Re: [..] Récupérer les noms des écrans
Posté : mer. 24 sept. 2014 14:33
par orax
J'avais juste vérifié la fonction. Le nom (qui devrait être
PnP-Monitor (Standard)) ne s'affiche pas.
Mais c'est peut-être normal puisque le Liteon (l'écran secondaire) n'a pas d'ID (j'avais édité mon message) :
http://www.autoitscript.fr/forum/viewto ... 943#p89943
Avec ce code, pour le Liteon, la msgbox m'indique juste le nom (sans l'ID) :
PnP-Monitor (Standard)► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
#include <MsgBoxConstants.au3>
#include <WinAPI.au3>
Local $aDevice, $i = 0
While 1
$aDevice = _WinAPI_EnumDisplayDevices("", $i)
If @error Or Not $aDevice[0] Then ExitLoop
_ArrayDisplay($aDevice)
ConsoleWrite($aDevice[1] & @CRLF)
$aDevice = _WinAPI_EnumDisplayDevices($aDevice[1], 0)
If Not @error Then MsgBox($MB_SYSTEMMODAL, "", $aDevice[2] & @CRLF & $aDevice[4])
_ArrayDisplay($aDevice)
$i += 1
WEnd
Re: [..] Récupérer les noms des écrans
Posté : jeu. 25 sept. 2014 15:05
par Yogui
Écran n°1 : DELL P1914S | DELL P1914S
Écran n°2 : DELL P1914S | DELL P1914S
Écran n°3 : |
petite contribution du boulot
c'est donc ok pour moi
Re: [..] Récupérer les noms des écrans
Posté : mer. 01 oct. 2014 21:58
par TommyDDR
Merci à tous pour vos réponses.
Juste pour le plaisir, voici le mien :
Écran n°1 : W2252 | W2252
Écran n°2 : Rift DK2 | Rift DK2