Ms Windows and Intel HD drivers

Lately, Intel HD Graphics is painful to use. Something about the brightness and contrast is not right. The result is headache after just about 15 minutes of use. This is a driver problem because the same card on Linux does not induce headaches; or even using Windows without IGfx drivers - a bit too bright but the eyes seem to cope.

Minimum brightness and contrast on Intel HD 5500 is just too high. Using the Power Saving features of the driver the brightness and contrast is lowered much further to a comfortable level. Only problem is power saving only works on battery (not AC) and brightness and contrast is automagically lowered and raised depending on the image currently displayed on screen. Very irritating.

@jimmy_m Is it possible to programmatically lower the brightness to the lowest level that the hardware permits. Am trying to do this using the Windows API and it just isn’t working.

Google fails me and Linux is not for me. Currently using Flux but it does not help that much.

Any other tech head. @Deorro, @The.Black.Templar, etc assist where you can.

If you upgraded to windows 10 be advised you will have to update to proper drivers on Intel website. Or
[ATTACH=full]69221[/ATTACH]

1 Like

I use Win 8.1. A step above seven but away from 10 madness. The latest intel drivers are the problem. A few years ago IGfx drivers were just drivers. Nowadays they add a bunch of background services and features for ‘premium experience’. That’s what causing my problem. It’s now not possible for a user to lower brightness to the absolute minimum as it was on older Intel drivers.

Just leave them at default. They work better that way

The default is not usable. Too bright and contrasty. And that’s the lowest allowed by the Igfx control panel. If their app can push the brightness lower than minimum, they should let users do it too.

What do you mean by too bright? Use the hardware keys on the keyboard if ni laptop to reduce the brightness. Default works fine for me when using Photoshop. Never had a problem

Hardware keys don’t respond unless drivers updated incase of an upgrade i.e

Very interesting, never used it to just reduce brightness (you can create some real havoc on a user with it :smiley: ) but i believe DeviceIOControl in kernel32 should work, however it will probably be limited to the values already predefined by the driver, you will probably have to make an api call to query them. so will have have to make to calls to DeviceIOControl, one to query the supported values and another one to set

be sure to post the full solution once done

I mean the lowest brightness is too bright.

I think am lost. I will read up on DeviceIOControl this evening. I also noticed that capabilities are listed as zero on driver properties. My first code has a weird error and my second attempt is just a temporary black screen!

Attempt 1:

[CODE]BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM dwData)
{
// We skip all this trouble if the monitor is not the primary monitor
MONITORINFOEXW mix;
ZeroMemory(&mix, sizeof(MONITORINFOEXW) );
mix.cbSize = sizeof(MONITORINFOEXW);

BOOL bSuccess = GetMonitorInfoW(hMonitor, &mix);
if ( !bSuccess || (bSuccess  && !(mix.dwFlags & MONITORINFOF_PRIMARY)) )
{
    // Move to next monitor.
    return TRUE;
}

DWORD dwNumOfPhysicalMonitors = 0UL;
if (!GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor, &dwNumOfPhysicalMonitors) )
{
    DisplayError( L"GetNumberOfPhysicalMonitorsFromHMONITOR" );
    return FALSE;  // Stop enumerating monitors
}


LPPHYSICAL_MONITOR lpPhysicalMonitors = (LPPHYSICAL_MONITOR)HeapAlloc(GetProcessHeap(),
        HEAP_ZERO_MEMORY, dwNumOfPhysicalMonitors * sizeof(PHYSICAL_MONITOR));
if ( !lpPhysicalMonitors )
{
    // Mem allocation error
    return FALSE;
}


if ( !GetPhysicalMonitorsFromHMONITOR(hMonitor, dwNumOfPhysicalMonitors, lpPhysicalMonitors) )
{
    HeapFree(GetProcessHeap(), 0, lpPhysicalMonitors);
    DisplayError( L"GetPhysicalMonitorsFromHMONITOR" );
    return FALSE;
}

for (DWORD i = 0; i < dwNumOfPhysicalMonitors; i++)
{
    // Get monitor capabilities
    DWORD dwMonitorCapabilities = 0UL;
    DWORD dwSupportedColourTemps = 0UL;
          
    BOOL bSuccess = GetMonitorCapabilities( lpPhysicalMonitors[i].hPhysicalMonitor,
        &dwMonitorCapabilities, &dwSupportedColourTemps );
    if ( !bSuccess )
    {
        DisplayError(TEXT("GetMonitorCapabilities") );
        continue;
    }

    // Needs to support brightness control
    if ( !(MC_CAPS_BRIGHTNESS & dwMonitorCapabilities) )
    {
        continue;
    }

    DWORD dwMinimumBrightness = 0;
    DWORD dwCurrentBrightness = 0;
    DWORD dwMaximumBrightness = 0;
    if (GetMonitorBrightness(lpPhysicalMonitors[i].hPhysicalMonitor,
        &dwMinimumBrightness, &dwCurrentBrightness, &dwMaximumBrightness))
    {
        // Aaaaaaaargh!
        // Shit don't even get here dawg.
        //

    }
    else {
        DisplayError( L"GetMonitorBrightness" );
    }
}


DestroyPhysicalMonitors(dwNumOfPhysicalMonitors, lpPhysicalMonitors);
HeapFree(GetProcessHeap(), 0, lpPhysicalMonitors);

// Continue enumeration
return TRUE;

}
[/CODE]
Result:
[ATTACH=full]69229[/ATTACH]

Attempt 2:

[CODE]int _tmain(int argc, _TCHAR* argv)
{
std::vector<DISPLAY_DEVICE> vDisplayDevices;
const USHORT MAX_DISPLAY_DEVICES = 9;

for( USHORT i = 0; i <= MAX_DISPLAY_DEVICES; i++ )
{
    DISPLAY_DEVICE dd = {0};
    dd.cb = sizeof(DISPLAY_DEVICE);
    BOOL bSuccess = EnumDisplayDevices(NULL, i, &dd, EDD_GET_DEVICE_INTERFACE_NAME);
    if ( !bSuccess || dd.StateFlags & DISPLAY_DEVICE_MIRRORING_DRIVER || !( dd.StateFlags & DISPLAY_DEVICE_ACTIVE ) )
    {
        continue;
    }

    // We need active displays only
    vDisplayDevices.push_back( dd );
}


// Change for first display only
if ( !vDisplayDevices.empty() )
{
    GUID guid = {0};
    UuidFromStringA( (RPC_CSTR) "02C62061-1097-11d1-920F-00A024DF156E", &guid);
    VIDEOPARAMETERS vpParams = { 0 };
    vpParams.Guid = guid;
    vpParams.dwFlags = VP_FLAGS_BRIGHTNESS;
    vpParams.dwCommand = VP_COMMAND_SET;
    vpParams.dwBrightness = 80;

    DEVMODE dmDevMode = { 0 };
    dmDevMode.dmSize = sizeof(DEVMODE);
    EnumDisplaySettings(vDisplayDevices[0].DeviceName, ENUM_CURRENT_SETTINGS, &dmDevMode);

    DWORD dwFlags = CDS_VIDEOPARAMETERS | CDS_RESET | CDS_UPDATEREGISTRY;
    ChangeDisplaySettingsEx( vDisplayDevices[0].DeviceName, &dmDevMode, NULL,  dwFlags, &vpParams);
}
  
return 0;

}

[/CODE]
Result: Temporary black screen as screen resets.

Am tired now.

Hehehe you remind me of this Indian guy in some Custom Android Kernel thread who keeps asking if gamma controls will be added to the Kernel

@TerribleWaste will give it a try once i get some free time and get back to you, on the blank screen, you are probably setting a value thats not supported, i think if you set say 12 and it only supports multiples of 10 it will cause such an error

:D:D:D:D

Just get Windows 10 …I Don know y u still use 8.1 .windows 7 I understand …8.1 makes no sense at all. Anyways is this issue their in windows if not install 10 -copy drivers and registry and then go roll back if it still shit install manually had a lap that had hardware limitations but it was a reversal of this situation.

Never had that kind of a problem before :frowning: