我有这个脚本,我正在获得所有显示器的水平和垂直分辨率,但到目前为止我没有找到任何方法来知道显示器的坐标(我需要知道第二个显示器是否连接到计算机位于主显示屏的左侧或右侧)。 有没有我可以使用vbscript运行的代码可以获取这些信息?
Set wmiObjSet = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_VideoController")
For Each obj In wmiObjSet
WScript.Echo obj.CurrentHorizontalResolution
WScript.Echo obj.CurrentVerticalResolution
Next
谢谢!
答案 0 :(得分:0)
遗憾的是,WMI中似乎不存在这些信息。它在注册表中,例如有关2个监视器的信息可能是2个键,如下所示:
HKEY_CURRENT_CONFIG\System\CurrentControlSet\Control\VIDEO\{CDF19DFF-A10C-4CD9-ACD5-B830567D7476}\0000
HKEY_CURRENT_CONFIG\System\CurrentControlSet\Control\VIDEO\{CDF19DFF-A10C-4CD9-ACD5-B830567D7476}\0001
查看Attach.RelativeX
的值,我认为值为零表示主监视器,正数表示监视器是主要的,左侧为负。
那么问题是如何确定视频适配器的CLSID ......这有点令人费解。我也许会从PNPDeviceID
中选择Win32_VideoController
,它看起来像是:
PCI\VEN_8086&DEV_0126&SUBSYS_161C103C&REV_09\3&e89b380&0&10
然后使用它来构建一个注册表项路径:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\PCI\VEN_8086&DEV_0126&SUBSYS_161C103C&REV_09\3&e89b380&0&10\Device Parameters
获取VideoID
的值,然后使用它来构建HKEY_CURRENT_CONFIG
密钥的路径。
编辑用于说明上述内容的脚本
Option Explicit
Const HKLM = &H80000002
Const HKCC = &H80000005
Dim reg, clsid, mons, xval, i
Dim wmi, vc
Set reg = GetObject("winmgmts:\\.\root\default:StdRegProv")
Set wmi = GetObject("winmgmts:")
'what if there is more than one instance of VideoController??
For Each vc In wmi.ExecQuery("Select * from Win32_VideoController")
Call reg.GetStringValue( HKLM, _
"SYSTEM\ControlSet001\Enum\" & vc.PNPDeviceID & "\Device Parameters", _
"VideoID", clsid)
Call reg.EnumKey(HKCC,"System\CurrentControlSet\Control\VIDEO\" & clsid,mons)
For i = LBound(mons) To UBound(mons)
Call reg.GetDWORDValue(HKCC, _
"System\CurrentControlSet\Control\VIDEO\" & clsid & "\" & mons(i), _
"Attach.RelativeX", xval)
If xval = 0 Then
WScript.Echo "Monitor " & mons(i) & " appears to be the primary monitor"
ElseIf xval < 0 Then
WScript.Echo "Monitor " & mons(i) & " is left of primary"
ElseIf xval > 0 Then
WScript.Echo "Monitor " & mons(i) & " is right of primary"
End If
Next
Next