-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathDesktop-Volume-Protector.ps1
More file actions
87 lines (80 loc) · 3.22 KB
/
Copy pathDesktop-Volume-Protector.ps1
File metadata and controls
87 lines (80 loc) · 3.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
Add-Type -TypeDefinition @"
using System.Runtime.InteropServices;
[Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IAudioEndpointVolume
{
int f(); int g(); int h(); int i();
int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);
int j();
int GetMasterVolumeLevelScalar(out float pfLevel);
int k(); int l(); int m(); int n();
int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);
int GetMute(out bool pbMute);
}
[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDevice
{
int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);
}
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
interface IMMDeviceEnumerator
{
int f();
int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);
}
[ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }
public class Audio
{
static IAudioEndpointVolume Vol()
{
var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
IMMDevice dev = null;
Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));
IAudioEndpointVolume epv = null;
var epvid = typeof(IAudioEndpointVolume).GUID;
Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));
return epv;
}
public static float Volume
{
get { float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v; }
set { Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty)); }
}
public static bool Mute
{
get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }
set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }
}
}
"@
function Set-Volume([Parameter(Mandatory=$true)][ValidateRange(0,100)][Int]$percent) {
try {
# Create the Windows Shell object.
$obj = New-Object -ComObject WScript.Shell
# Lower the volume if it's higher than the specified level.
do {
$obj.SendKeys([char]174) # Volume down
} while ([Audio]::Volume -gt $percent/100)
# Raise the volume if it's lower than the specified level.
do {
$obj.SendKeys([char]175) # Volume up
} while ([Audio]::Volume -lt $percent/100)
} catch {
"⚠️ Error in line $($_.InvocationInfo.ScriptLineNumber): $($Error[0])"
}
}
$checkIntervalMinutes = 10 #set this to your desired interval
$highVolumeCount = 0
while ($true) {
Start-Sleep -Seconds ($checkIntervalMinutes * 60) # Convert minutes to seconds
$currentVolume = [Audio]::Volume
if ($currentVolume -gt 0.7) {
$highVolumeCount++
if ($highVolumeCount -ge 1) { # Adjusted to 1 for 10 minutes interval
Set-Volume -percent 60 #Set this to your desired volume to reduce
$highVolumeCount = 0
}
} else {
$highVolumeCount = 0
}
}