; 鼠标在任务栏滚动调整音量
#If MouseIsOver("ahk_class Shell_TrayWnd") || MouseIsOver("ahk_class Shell_SecondaryTrayWnd")
WheelUp::Send {Volume_Up}
WheelDown::Send {Volume_Down}
; 任务栏 Ctrl + 鼠标滚动,调整屏幕亮度
^WheelUp:: AdjustScreenBrightness(5)
^WheelDown:: AdjustScreenBrightness(-5)
MouseIsOver(WinTitle) {
MouseGetPos,,, Win
return WinExist(WinTitle . " ahk_id " . Win)
}
AdjustScreenBrightness(step) {
service := "winmgmts:{impersonationLevel=impersonate}!\\.\root\WMI"
monitors := ComObjGet(service).ExecQuery("SELECT * FROM WmiMonitorBrightness WHERE Active=TRUE")
monMethods := ComObjGet(service).ExecQuery("SELECT * FROM wmiMonitorBrightNessMethods WHERE Active=TRUE")
for i in monitors {
curt := i.CurrentBrightness
break
}
toSet := curt + step
if (toSet > 100)
toSet := 100
if (toSet < 0)
toSet := 0
for i in monMethods {
i.WmiSetBrightness(1, toSet)
break
}
BrightnessOSD()
}
BrightnessOSD() {
static PostMessagePtr := DllCall("GetProcAddress", "Ptr", DllCall("GetModuleHandle", "Str", "user32.dll", "Ptr"), "AStr", A_IsUnicode ? "PostMessageW" : "PostMessageA", "Ptr")
,WM_SHELLHOOK := DllCall("RegisterWindowMessage", "Str", "SHELLHOOK", "UInt")
static FindWindow := DllCall("GetProcAddress", "Ptr", DllCall("GetModuleHandle", "Str", "user32.dll", "Ptr"), "AStr", A_IsUnicode ? "FindWindowW" : "FindWindowA", "Ptr")
HWND := DllCall(FindWindow, "Str", "NativeHWNDHost", "Str", "", "Ptr")
IF !(HWND) {
try IF ((shellProvider := ComObjCreate("{C2F03A33-21F5-47FA-B4BB-156362A2F239}", "{00000000-0000-0000-C000-000000000046}"))) {
try IF ((flyoutDisp := ComObjQuery(shellProvider, "{41f9d2fb-7834-4ab6-8b1b-73e74064b465}", "{41f9d2fb-7834-4ab6-8b1b-73e74064b465}"))) {
DllCall(NumGet(NumGet(flyoutDisp+0)+3*A_PtrSize), "Ptr", flyoutDisp, "Int", 0, "UInt", 0)
,ObjRelease(flyoutDisp)
}
ObjRelease(shellProvider)
}
HWND := DllCall(FindWindow, "Str", "NativeHWNDHost", "Str", "", "Ptr")
}
DllCall(PostMessagePtr, "Ptr", HWND, "UInt", WM_SHELLHOOK, "Ptr", 0x37, "Ptr", 0)
}
#If
#NoEnv
#AllowSameLineComments
#SingleInstance force
#InstallKeybdHook
;#NoTrayIcon
SetWorkingDir %A_ScriptDir%
SendMode, Input
SC108:: ; SAMSUNG brightness up FN key
MoveBrightness(1)
return
SC109:: ; SAMSUNG brightness down FN key
MoveBrightness(-1)
return
;#a::
;MoveBrightness(1)
;return
;#z::
;MoveBrightness(-1)
;return
;############################################################################
; Functions
;############################################################################
MoveBrightness(IndexMove)
{
VarSetCapacity(SupportedBrightness, 256, 0)
VarSetCapacity(SupportedBrightnessSize, 4, 0)
VarSetCapacity(BrightnessSize, 4, 0)
VarSetCapacity(Brightness, 3, 0)
hLCD := DllCall("CreateFile"
, Str, "\\.\LCD"
, UInt, 0x80000000 | 0x40000000 ;Read | Write
, UInt, 0x1 | 0x2 ; File Read | File Write
, UInt, 0
, UInt, 0x3 ; open any existing file
, UInt, 0
, UInt, 0)
if hLCD != -1
{
DevVideo := 0x00000023, BuffMethod := 0, Fileacces := 0
NumPut(0x03, Brightness, 0, "UChar") ; 0x01 = Set AC, 0x02 = Set DC, 0x03 = Set both
NumPut(0x00, Brightness, 1, "UChar") ; The AC brightness level
NumPut(0x00, Brightness, 2, "UChar") ; The DC brightness level
DllCall("DeviceIoControl"
, UInt, hLCD
, UInt, (DevVideo<<16 | 0x126<<2 | BuffMethod<<14 | Fileacces) ; IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS
, UInt, 0
, UInt, 0
, UInt, &Brightness
, UInt, 3
, UInt, &BrightnessSize
, UInt, 0)
DllCall("DeviceIoControl"
, UInt, hLCD
, UInt, (DevVideo<<16 | 0x125<<2 | BuffMethod<<14 | Fileacces) ; IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS
, UInt, 0
, UInt, 0
, UInt, &SupportedBrightness
, UInt, 256
, UInt, &SupportedBrightnessSize
, UInt, 0)
ACBrightness := NumGet(Brightness, 1, "UChar")
ACIndex := 0
DCBrightness := NumGet(Brightness, 2, "UChar")
DCIndex := 0
BufferSize := NumGet(SupportedBrightnessSize, 0, "UInt")
MaxIndex := BufferSize-1
Loop, %BufferSize%
{
ThisIndex := A_Index-1
ThisBrightness := NumGet(SupportedBrightness, ThisIndex, "UChar")
if ACBrightness = %ThisBrightness%
ACIndex := ThisIndex
if DCBrightness = %ThisBrightness%
DCIndex := ThisIndex
}
if DCIndex >= %ACIndex%
BrightnessIndex := DCIndex
else
BrightnessIndex := ACIndex
BrightnessIndex += IndexMove
if BrightnessIndex > %MaxIndex%
BrightnessIndex := MaxIndex
if BrightnessIndex < 0
BrightnessIndex := 0
NewBrightness := NumGet(SupportedBrightness, BrightnessIndex, "UChar")
NumPut(0x03, Brightness, 0, "UChar") ; 0x01 = Set AC, 0x02 = Set DC, 0x03 = Set both
NumPut(NewBrightness, Brightness, 1, "UChar") ; The AC brightness level
NumPut(NewBrightness, Brightness, 2, "UChar") ; The DC brightness level
DllCall("DeviceIoControl"
, UInt, hLCD
, UInt, (DevVideo<<16 | 0x127<<2 | BuffMethod<<14 | Fileacces) ; IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS
, UInt, &Brightness
, UInt, 3
, UInt, 0
, UInt, 0
, UInt, 0
, Uint, 0)
DllCall("CloseHandle", UInt, hLCD)
}
}