2

WmiSetBrightness メソッドを使用してモニターの明るさ (ガンマ ランプ値ではなく) を調整しようとしていますが、システムは実行時に「サポートされていません」という ManagementException をスローします。多くの人がこのコンセプトを使って成功しているのを見てきました。それで、私の何が問題なのですか?これは、Windows 7 Ultimate ではサポートされていないためですか。私が取り組んでいる?私のコードは次のとおりです。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1_Click
    Try
        Dim mclass As New ManagementClass("WmiMonitorBrightnessMethods")
        mclass.Scope = New ManagementScope("\\.\root\wmi")
        Dim instances As ManagementObjectCollection = mclass.GetInstances()

        For Each instance As ManagementObject In instances
            Dim brightness As Byte = 50 'In percent.
            Dim timeout As UInt64 = 1 'In seconds.
            Dim args As Object() = New Object() {brightness, timeout}
            instance.InvokeMethod("WmiSetBrightness", args) 'Only work on the first object.
            Exit For
        Next
    Catch ex As ManagementException
        MessageBox.Show(ex.Message)
    End Try
End Sub

インスタンスが文字通り取得されているかどうかをテストするために、foreach 部分にコメントを付け、MessageBox を介して instances.Count.ToString() を使用してインスタンスの数を出力しようとしましたが、それでも例外がスローされます。

別の方法として、DeviceIOControl と IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS を使用しようとしましたが、成功しませんでした。コードは次のとおりです。

Public Class Form1
    Private Declare Auto Function CreateFile Lib "kernel32" _
    (ByVal lpFileName As String, ByVal dwDesiredAccess As Int32, _
     ByVal dwShareMode As Int32, ByVal lpSecurityAttributes As IntPtr, _
     ByVal dwCreationDisposition As Int32, _
     ByVal dwFlagsAndAttributes As Int32, ByVal hTemplateFile As IntPtr) As IntPtr

    Const GENERIC_READ As Int32 = &H80000000%
    Const SHARE_ALL As Int32 = &H7%
    Const OPEN_EXISTING As Int32 = &H3%

    Const IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS As Integer = &H23049C%

    Private Structure BRIGHTNESS
        Public ucDisplayPolicy As Byte
        Public ucACBrightness As Byte
        Public ucDCBrightness As Byte
    End Structure

    Private Declare Auto Function DeviceIoControl Lib "kernel32" _
     (ByVal hDevice As IntPtr, ByVal dwIoControlCode As Int32, _
     ByRef lpInBuffer As BRIGHTNESS, ByVal nInBufferSize As Int32, _
     ByVal lpOutBuffer As IntPtr, ByVal nOutBufferSize As Int32, _
     ByRef lpBytesReturned As Int32, ByVal lpOverlapped As IntPtr) As Boolean

    Private Declare Auto Function CloseHandle Lib "kernel32" _
     (ByVal hObject As IntPtr) As Boolean

    ''' <summary>
    ''' Set the brightness of the screen.
    ''' </summary>
    ''' <param name="Brightness">The Screen Brightness.</param>
    Private Sub SetBrightness(ByRef Brightness As BRIGHTNESS)
        ' Get the display.
        Dim pDisplay As IntPtr = _
         CreateFile("\\.\LCD", GENERIC_READ, SHARE_ALL, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero)

        ' Set the brightness.
        DeviceIoControl(pDisplay, IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS, _
        Brightness, Runtime.InteropServices.Marshal.SizeOf(Brightness), IntPtr.Zero, 0, Nothing, IntPtr.Zero)

        ' Close the handle.
        CloseHandle(pDisplay)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim brightness As BRIGHTNESS

        ' The brightness on DC Power.
        brightness.ucDCBrightness = 100
        ' The Brightness on AC Power.
        brightness.ucACBrightness = 100

        ' Call the function.
        SetBrightness(brightness)
    End Sub
End Class

何らかの理由で、DeviceIoControl は常に False を返します。これらの整理にご協力ください。

ところで、これはモニターのコントラストを調整するため、SetDeviceGammaRamp を使用してガンマ ランプ値を変更することではありません。明るさではありません。したがって、その問題に関する投稿はあまり役に立ちません。

よろしく!

4

1 に答える 1