AutoHotkey wrapper for Monitor Configuration API Functions (msdn-docs)
Source
Mirror: Release on GitHub
Code: Select all
; ===============================================================================================================================
; AutoHotkey wrapper for Monitor Configuration API Functions
;
; Author ....: jNizM
; Released ..: 2015-05-26
; Modified ..: 2020-07-29
; Github ....: https://github.com/jNizM/Class_Monitor
; Forum .....: https://www.autohotkey.com/boards/viewtopic.php?f=6&t=62955
; ===============================================================================================================================
class Monitor
{
; ===== PUBLIC METHODS ======================================================================================================
GetBrightness(Display := "")
{
if (hMonitor := this.GetMonitorHandle(Display))
{
PhysicalMonitors := this.GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor)
hPhysicalMonitor := this.GetPhysicalMonitorsFromHMONITOR(hMonitor, PhysicalMonitors, PHYSICAL_MONITOR)
Brightness := this.GetMonitorBrightness(hPhysicalMonitor)
this.DestroyPhysicalMonitors(PhysicalMonitors, PHYSICAL_MONITOR)
return Brightness
}
return false
}
GetContrast(Display := "")
{
if (hMonitor := this.GetMonitorHandle(Display))
{
PhysicalMonitors := this.GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor)
hPhysicalMonitor := this.GetPhysicalMonitorsFromHMONITOR(hMonitor, PhysicalMonitors, PHYSICAL_MONITOR)
Contrast := this.GetMonitorContrast(hPhysicalMonitor)
this.DestroyPhysicalMonitors(PhysicalMonitors, PHYSICAL_MONITOR)
return Contrast
}
return false
}
GetGammaRamp(Display := "")
{
if (DisplayName := this.GetDisplayName(Display))
{
if (hDC := this.CreateDC(DisplayName))
{
GammaRamp := this.GetDeviceGammaRamp(hDC)
this.DeleteDC(hDC)
return GammaRamp
}
this.DeleteDC(hDC)
}
return false
}
RestoreFactoryDefault(Display := "")
{
if (hMonitor := this.GetMonitorHandle(Display))
{
PhysicalMonitors := this.GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor)
hPhysicalMonitor := this.GetPhysicalMonitorsFromHMONITOR(hMonitor, PhysicalMonitors, PHYSICAL_MONITOR)
this.RestoreMonitorFactoryDefaults(hPhysicalMonitor)
this.DestroyPhysicalMonitors(PhysicalMonitors, PHYSICAL_MONITOR)
return true
}
return false
}
SetBrightness(Brightness, Display := "")
{
if (hMonitor := this.GetMonitorHandle(Display))
{
PhysicalMonitors := this.GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor)
hPhysicalMonitor := this.GetPhysicalMonitorsFromHMONITOR(hMonitor, PhysicalMonitors, PHYSICAL_MONITOR)
GetBrightness := this.GetMonitorBrightness(hPhysicalMonitor)
Brightness := (Brightness < GetBrightness["Minimum"]) ? GetBrightness["Minimum"]
: (Brightness > GetBrightness["Maximum"]) ? GetBrightness["Maximum"]
: (Brightness)
this.SetMonitorBrightness(hPhysicalMonitor, Brightness)
this.DestroyPhysicalMonitors(PhysicalMonitors, PHYSICAL_MONITOR)
return Brightness
}
return false
}
SetContrast(Contrast, Display := "")
{
if (hMonitor := this.GetMonitorHandle(Display))
{
PhysicalMonitors := this.GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor)
hPhysicalMonitor := this.GetPhysicalMonitorsFromHMONITOR(hMonitor, PhysicalMonitors, PHYSICAL_MONITOR)
GetContrast := this.GetMonitorContrast(hPhysicalMonitor)
Contrast := (Contrast < GetContrast["Minimum"]) ? GetContrast["Minimum"]
: (Contrast > GetContrast["Maximum"]) ? GetContrast["Maximum"]
: (Contrast)
this.SetMonitorContrast(hPhysicalMonitor, Contrast)
this.DestroyPhysicalMonitors(PhysicalMonitors, PHYSICAL_MONITOR)
return Contrast
}
return false
}
SetGammaRamp(Red, Green, Blue, Display := "")
{
if (DisplayName := this.GetDisplayName(Display))
{
if (hDC := this.CreateDC(DisplayName))
{
this.SetDeviceGammaRamp(hDC, Red, Green, Blue)
this.DeleteDC(hDC)
return true
}
this.DeleteDC(hDC)
}
return false
}
; ===== PRIVATE METHODS =====================================================================================================
CreateDC(DisplayName)
{
if (hDC := DllCall("gdi32\CreateDC", "str", DisplayName, "ptr", 0, "ptr", 0, "ptr", 0, "ptr"))
return hDC
return false
}
DeleteDC(hDC)
{
if (DllCall("gdi32\DeleteDC", "ptr", hDC))
return true
return false
}
DestroyPhysicalMonitors(PhysicalMonitorArraySize, PHYSICAL_MONITOR)
{
if (DllCall("dxva2\DestroyPhysicalMonitors", "uint", PhysicalMonitorArraySize, "ptr", &PHYSICAL_MONITOR))
return true
return false
}
EnumDisplayMonitors(hMonitor := "")
{
static EnumProc := RegisterCallback(Monitor.EnumProc)
static DisplayMonitors := {}
if (MonitorNumber = "")
DisplayMonitors := {}
if (DisplayMonitors.MaxIndex() = "")
if (DllCall("user32\EnumDisplayMonitors", "ptr", 0, "ptr", 0, "ptr", EnumProc, "ptr", &DisplayMonitors, "uint"))
return (MonitorNumber = "") ? DisplayMonitors : DisplayMonitors.HasKey(MonitorNumber) ? DisplayMonitors[MonitorNumber] : false
return false
}
EnumProc(hDC, RECT, ObjectAddr)
{
DisplayMonitors := Object(ObjectAddr)
MonitorInfo := Monitor.GetMonitorInfo(this)
DisplayMonitors.Push(MonitorInfo)
return true
}
GetDeviceGammaRamp(hMonitor)
{
VarSetCapacity(GAMMA_RAMP, 1536, 0)
if (DllCall("gdi32\GetDeviceGammaRamp", "ptr", hMonitor, "ptr", &GAMMA_RAMP))
{
GammaRamp := []
GammaRamp["Red"] := NumGet(GAMMA_RAMP, 2, "ushort") - 128
GammaRamp["Green"] := NumGet(GAMMA_RAMP, 512 + 2, "ushort") - 128
GammaRamp["Blue"] := NumGet(GAMMA_RAMP, 1024 + 2, "ushort") - 128
return GammaRamp
}
return false
}
GetDisplayName(Display := "")
{
DisplayName := ""
if (Enum := this.EnumDisplayMonitors()) && (Display != "")
{
for k, Mon in Enum
if (InStr(Mon["Name"], Display))
DisplayName := Mon["Name"]
}
if (DisplayName = "")
if (hMonitor := this.MonitorFromWindow())
DisplayName := this.GetMonitorInfo(hMonitor)["Name"]
return DisplayName
}
GetMonitorBrightness(hMonitor)
{
if (DllCall("dxva2\GetMonitorBrightness", "ptr", hMonitor, "uint*", Minimum, "uint*", Current, "uint*", Maximum))
return { "Minimum": Minimum, "Current": Current, "Maximum": Maximum }
return false
}
GetMonitorContrast(hMonitor)
{
if (DllCall("dxva2\GetMonitorContrast", "ptr", hMonitor, "uint*", Minimum, "uint*", Current, "uint*", Maximum))
return { "Minimum": Minimum, "Current": Current, "Maximum": Maximum }
return false
}
GetMonitorHandle(Display := "")
{
hMonitor := 0
if (Enum := this.EnumDisplayMonitors()) && (Display != "")
{
for k, Mon in Enum
if (InStr(Mon["Name"], Display))
hMonitor := Mon["Handle"]
}
if !(hMonitor)
hMonitor := this.MonitorFromWindow()
return hMonitor
}
GetMonitorInfo(hMonitor)
{
NumPut(VarSetCapacity(MONITORINFOEX, 40 + (32 << !!A_IsUnicode)), MONITORINFOEX, 0, "uint")
if (DllCall("user32\GetMonitorInfo", "ptr", hMonitor, "ptr", &MONITORINFOEX))
{
MONITORINFO := []
MONITORINFO["Handle"] := hMonitor
MONITORINFO["Name"] := Name := StrGet(&MONITORINFOEX + 40, 32)
MONITORINFO["Number"] := RegExReplace(Name, ".*(\d+)$", "$1")
MONITORINFO["Left"] := NumGet(MONITORINFOEX, 4, "int")
MONITORINFO["Top"] := NumGet(MONITORINFOEX, 8, "int")
MONITORINFO["Right"] := NumGet(MONITORINFOEX, 12, "int")
MONITORINFO["Bottom"] := NumGet(MONITORINFOEX, 16, "int")
MONITORINFO["WALeft"] := NumGet(MONITORINFOEX, 20, "int")
MONITORINFO["WATop"] := NumGet(MONITORINFOEX, 24, "int")
MONITORINFO["WARight"] := NumGet(MONITORINFOEX, 28, "int")
MONITORINFO["WABottom"] := NumGet(MONITORINFOEX, 32, "int")
MONITORINFO["Primary"] := NumGet(MONITORINFOEX, 36, "uint")
return MONITORINFO
}
return false
}
GetNumberOfPhysicalMonitorsFromHMONITOR(hMonitor)
{
if (DllCall("dxva2\GetNumberOfPhysicalMonitorsFromHMONITOR", "ptr", hMonitor, "uint*", NumberOfPhysicalMonitors))
return NumberOfPhysicalMonitors
return false
}
GetPhysicalMonitorsFromHMONITOR(hMonitor, PhysicalMonitorArraySize, ByRef PHYSICAL_MONITOR)
{
VarSetCapacity(PHYSICAL_MONITOR, (A_PtrSize + 256) * PhysicalMonitorArraySize, 0)
if (DllCall("dxva2\GetPhysicalMonitorsFromHMONITOR", "ptr", hMonitor, "uint", PhysicalMonitorArraySize, "ptr", &PHYSICAL_MONITOR))
return NumGet(PHYSICAL_MONITOR, 0, "ptr")
return false
}
MonitorFromWindow(hWindow := 0)
{
static MONITOR_DEFAULTTOPRIMARY := 0x00000001
if (hMonitor := DllCall("user32\MonitorFromWindow", "ptr", hWindow, "uint", MONITOR_DEFAULTTOPRIMARY))
return hMonitor
return false
}
RestoreMonitorFactoryDefaults(hMonitor)
{
if (DllCall("dxva2\RestoreMonitorFactoryDefaults", "ptr", hMonitor))
return false
return true
}
SetDeviceGammaRamp(hMonitor, Red, Green, Blue)
{
loop % VarSetCapacity(GAMMA_RAMP, 1536, 0) / 6
{
NumPut((r := (red + 128) * (A_Index - 1)) > 65535 ? 65535 : r, GAMMA_RAMP, 2 * (A_Index - 1), "ushort")
NumPut((g := (green + 128) * (A_Index - 1)) > 65535 ? 65535 : g, GAMMA_RAMP, 512 + 2 * (A_Index - 1), "ushort")
NumPut((b := (blue + 128) * (A_Index - 1)) > 65535 ? 65535 : b, GAMMA_RAMP, 1024 + 2 * (A_Index - 1), "ushort")
}
if (DllCall("gdi32\SetDeviceGammaRamp", "ptr", hMonitor, "ptr", &GAMMA_RAMP))
return true
return false
}
SetMonitorBrightness(hMonitor, Brightness)
{
if (DllCall("dxva2\SetMonitorBrightness", "ptr", hMonitor, "uint", Brightness))
return true
return false
}
SetMonitorContrast(hMonitor, Contrast)
{
if (DllCall("dxva2\SetMonitorContrast", "ptr", hMonitor, "uint", Contrast))
return true
return false
}
}
; ===============================================================================================================================
For AHK v2
Monitor Class v2 by Tigerlily
Questions / Bugs / Issues
If you notice any kind of bugs or issues, report them here. Same for any kind of questions.
Copyright and License
The Unlicense