122 lines
3.2 KiB
Text
122 lines
3.2 KiB
Text
#SingleInstance Force
|
|
#Persistent
|
|
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
|
|
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
|
|
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
|
|
|
|
if not A_IsAdmin
|
|
{
|
|
Run *RunAs "%A_ScriptFullPath%" ; Requires v1.0.92.01+
|
|
ExitApp
|
|
}
|
|
|
|
; Define constants
|
|
DEVICE_NAME := "SteelSeries Sonar - Media"
|
|
VOLUME_STEP := 1311
|
|
|
|
; Create GUI for OSD
|
|
Gui, +AlwaysOnTop +ToolWindow -Caption +LastFound
|
|
Gui, Color, 000000
|
|
Gui, Font, s20 cFFFFFF, Segoe UI
|
|
Gui, Add, Text, vVolumeText w180 x10, Volume: --`% ; Reduced width to 180, left-aligned with 10px margin
|
|
WinSet, Transparent, 200
|
|
Gui, +E0x20 ; Click through
|
|
|
|
; Global variables to track volume
|
|
global currentVolume := 0
|
|
global isMuted := 0
|
|
|
|
; Function to show volume OSD
|
|
ShowVolumeOSD() {
|
|
; Update OSD text
|
|
if (isMuted) {
|
|
GuiControl,, VolumeText, Volume: Muted
|
|
} else {
|
|
GuiControl,, VolumeText, Volume: %currentVolume%`%
|
|
}
|
|
|
|
; Position the OSD in the center of the screen
|
|
SysGet, MonitorWorkArea, MonitorWorkArea
|
|
OSDWidth := 300
|
|
OSDHeight := 60
|
|
xPos := MonitorWorkAreaRight - OSDWidth / 2
|
|
yPos := MonitorWorkAreaBottom - OSDHeight / 2
|
|
|
|
; Show the OSD
|
|
Gui, Show, NoActivate w%OSDWidth% h%OSDHeight% x%xPos% y%yPos%
|
|
|
|
; Auto-hide after 1.5 seconds
|
|
SetTimer, HideOSD, -1500
|
|
}
|
|
|
|
; Auto-hide function
|
|
HideOSD:
|
|
Gui, Hide
|
|
return
|
|
|
|
; Initialize volume (try to get initial value)
|
|
InitializeVolume:
|
|
tempFile := A_Temp . "\volume_init.txt"
|
|
RunWait, %comspec% /c C:\Nircmd\nircmd.exe setsysvolume 0 "%DEVICE_NAME%" > "%tempFile%" 2>&1,, Hide
|
|
FileRead, volumeOutput, %tempFile%
|
|
RegExMatch(volumeOutput, "Before change.* (\d+)", volumeMatch)
|
|
volume := volumeMatch1
|
|
if (volume != "") {
|
|
currentVolume := Round((volume / 65535) * 100)
|
|
}
|
|
FileDelete, %tempFile%
|
|
|
|
; Check mute state
|
|
tempFile := A_Temp . "\mute_init.txt"
|
|
RunWait, %comspec% /c C:\Nircmd\nircmd.exe mutesysvolume 3 "%DEVICE_NAME%" > "%tempFile%" 2>&1,, Hide
|
|
FileRead, muteOutput, %tempFile%
|
|
isMuted := InStr(muteOutput, "muted")
|
|
FileDelete, %tempFile%
|
|
return
|
|
|
|
; Run initialization on startup
|
|
GoSub, InitializeVolume
|
|
|
|
Volume_Up::
|
|
; Calculate new volume
|
|
newVolume := currentVolume + 2 ; Approximately 2% per step
|
|
if (newVolume > 100)
|
|
newVolume := 100
|
|
|
|
; Update our tracker
|
|
currentVolume := newVolume
|
|
isMuted := 0
|
|
|
|
; Execute volume change
|
|
Run, C:\Nircmd\nircmd.exe changesysvolume %VOLUME_STEP% "%DEVICE_NAME%",, Hide
|
|
|
|
; Show the OSD
|
|
ShowVolumeOSD()
|
|
Return
|
|
|
|
Volume_Down::
|
|
; Calculate new volume
|
|
newVolume := currentVolume - 2 ; Approximately 2% per step
|
|
if (newVolume < 0)
|
|
newVolume := 0
|
|
|
|
; Update our tracker
|
|
currentVolume := newVolume
|
|
|
|
; Execute volume change
|
|
Run, C:\Nircmd\nircmd.exe changesysvolume -%VOLUME_STEP% "%DEVICE_NAME%",, Hide
|
|
|
|
; Show the OSD
|
|
ShowVolumeOSD()
|
|
Return
|
|
|
|
Volume_Mute::
|
|
; Toggle mute state
|
|
isMuted := !isMuted
|
|
|
|
; Execute mute toggle
|
|
Run, C:\Nircmd\nircmd.exe mutesysvolume 2 "%DEVICE_NAME%",, Hide
|
|
|
|
; Show the OSD
|
|
ShowVolumeOSD()
|
|
Return
|