Click here to Skip to main content
11,577,954 members (60,510 online)
Rate this: bad
good
Please Sign up or sign in to vote.
See more: Win7 VB.NET .NET4 WinForm
I'm trying to adjust the brightness (not the gamma ramp values) of the monitor using WmiSetBrightness method but the system throws a ManagementException during runtime saying 'Not supported'. I have seen a lot of people using this concept and running successfully. So what's wrong with mine? Is it because this is not supported in Windows 7 Ultimate; on which I'm working?
My Code follows:

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

To test if the instances are literally obtained, I commented the foreach part and tried to print the count of the instances using instances.Count.ToString() through a MessageBox but still the exception is thrown.

As an alternative, I tried to work with DeviceIOControl and IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS but of no success. The code follows:

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

For some reason DeviceIoControl always returns False.
Please assist in sorting these out.

BTW, this is not about modifying gamma ramp values using SetDeviceGammaRamp, as it adjusts the contrast of the monitor; not the brightness. So, any post on that matter won't be of much help.

Regards!
Posted 15-Sep-12 4:57am
Edited 15-Sep-12 5:02am
v2

1 solution

Rate this: bad
good
Please Sign up or sign in to vote.

Solution 1

This will only work if youre display driver supports this. Apparently, it doesn't.

There is nothing at all that says a manufacturer has to add WMI support to their driver software.
  Permalink  

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
0 Peter Leow 170
1 Richard MacCutchan 165
2 DamithSL 150
3 OriginalGriff 145
4 Afzaal Ahmad Zeeshan 125
0 OriginalGriff 830
1 Sergey Alexandrovich Kryukov 701
2 Abhinav S 573
3 F-ES Sitecore 420
4 Dave Kreskowiak 374


Advertise | Privacy | Mobile
Web03 | 2.8.150603.1 | Last Updated 15 Sep 2012
Copyright © CodeProject, 1999-2015
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100