2

我正在查看 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\DISPLAY 中的监视器列表

在 Windows 7 中,每个屏幕节点下都有一个名为“Control”的子项,用于指示屏幕是否处于活动状态。在 Windows 8 中没有这样的子项。

如何从 Windows 8 注册表中确定监视器是否处于活动状态?

4

1 回答 1

0

试试这个代码(我验证了这一点):

Public Function GetMonitorDetails() As List(Of WSGetLoginData.Monitor)
    'Open the Display Reg-Key
    Dim wmiPNPID As New List(Of String)

    Dim mc As System.Management.ManagementClass
    Dim moc As ManagementObjectCollection
    Dim PathPNPID As String


    mc = New ManagementClass("Win32_DesktopMonitor")
    moc = mc.GetInstances()
    For Each mo In moc
        PathPNPID = mo.Item("PNPDeviceID")
        If PathPNPID.Trim <> "" AndAlso PathPNPID.Contains("\") Then
            PathPNPID = PathPNPID.Substring(PathPNPID.LastIndexOf("\") + 1)
            wmiPNPID.Add(PathPNPID.ToUpper)
        End If
    Next

    Dim Display As RegistryKey = Registry.LocalMachine
    Dim bFailed As [Boolean] = False
    Dim obj_ListMonitor As New List(Of WSGetLoginData.Monitor)
    Try
        Display = Registry.LocalMachine.OpenSubKey("SYSTEM\CurrentControlSet\Enum\DISPLAY")
    Catch
        bFailed = True
    End Try

    If Not bFailed And (Display IsNot Nothing) Then

        'Get all MonitorIDss
        For Each sMonitorID As String In Display.GetSubKeyNames()
            Dim MonitorID As RegistryKey = Display.OpenSubKey(sMonitorID)

            If MonitorID IsNot Nothing Then
                'Get all Plug&Play ID's
                For Each sPNPID As String In MonitorID.GetSubKeyNames()
                    Dim PnPID As RegistryKey = MonitorID.OpenSubKey(sPNPID)
                    If PnPID IsNot Nothing Then
                        Dim sSubkeys As String() = PnPID.GetSubKeyNames()

                        'Check if Monitor is active
                        'If Array.IndexOf(sSubkeys, "Control") > -1 Then
                        If Not wmiPNPID Is Nothing AndAlso wmiPNPID.Count > 0 AndAlso wmiPNPID.Contains(sPNPID.ToUpper) Then
                            If Array.IndexOf(sSubkeys, "Device Parameters") > -1 Then
                                Dim DevParam As RegistryKey = PnPID.OpenSubKey("Device Parameters")
                                Dim sSerial As String = ""
                                Dim sModel As String = ""

                                'Define Search Keys
                                Dim sSerFind As New String(New Char() {ChrW(0), ChrW(0), ChrW(0), ChrW(&HFF)})
                                Dim sModFind As New String(New Char() {ChrW(0), ChrW(0), ChrW(0), ChrW(&HFC)})

                                'Get the EDID code
                                Dim bObj As Byte() = TryCast(DevParam.GetValue("EDID", Nothing), Byte())
                                If bObj IsNot Nothing Then
                                    'Get the 4 Vesa descriptor blocks
                                    Dim sDescriptor As String() = New String(3) {}
                                    sDescriptor(0) = Encoding.[Default].GetString(bObj, &H36, 18)
                                    sDescriptor(1) = Encoding.[Default].GetString(bObj, &H48, 18)
                                    sDescriptor(2) = Encoding.[Default].GetString(bObj, &H5A, 18)
                                    sDescriptor(3) = Encoding.[Default].GetString(bObj, &H6C, 18)


                                    'Search the Keys
                                    For Each sDesc As String In sDescriptor
                                        If sDesc.Contains(sSerFind) Then
                                            sSerial = sDesc.Substring(4).Replace(vbNullChar, "").Trim()
                                        End If
                                        If sDesc.Contains(sModFind) Then
                                            sModel = sDesc.Substring(4).Replace(vbNullChar, "").Trim()
                                        End If


                                    Next
                                End If

                                If Not String.IsNullOrEmpty(sSerial) AndAlso sSerial.Trim <> "" Then
                                    Dim insertar As Boolean = True
                                    If Not obj_ListMonitor Is Nothing AndAlso obj_ListMonitor.Count > 0 Then
                                        For k As Integer = 0 To obj_ListMonitor.Count - 1
                                            If obj_ListMonitor(k).SerialNumber.Trim = sSerial Then
                                                insertar = False
                                                Exit For
                                            End If
                                        Next
                                    End If
                                    If insertar Then
                                        Dim obj_monitor As New WSGetLoginData.Monitor

                                        obj_monitor.UUID = Security.FingerPrint.Value(sModel & sSerial)
                                        obj_monitor.Modelo = sModel
                                        obj_monitor.SerialNumber = sSerial
                                        obj_ListMonitor.Add(obj_monitor)
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            End If
        Next
    End If
    Return obj_ListMonitor
End Function
于 2015-09-09T11:02:17.657 回答