Windows 10 kan beholde separate lydprofiler forforskjellige lydenheter. For hver lydenhet som du kobler til, kan du stille et annet volumnivå, og når enheten er tilkoblet, justeres volumet automatisk. Selvfølgelig holder ingen lydenheten dempet hele tiden. De vil øke eller redusere volumet, men ingen demper en lydenhet. Hvis du bruker et par hodetelefoner på skrivebordet ditt, og ofte må koble dem fra, kan du bruke et lite PowerShell-skript som automatisk vil dempe lyden når du kobler fra hodetelefonene.
Dette er noe mobiltelefoner gjør, dvs., når du kobler fra hodetelefonene, stopper musikken automatisk. Logikken bak dette er at du enten har hørt på musikk, eller at du ved et uhell har fjernet hodetelefonene dine, og at du trenger en rask måte å slå den av. Manuset ble i utgangspunktet skrevet på samme prinsipp av Prateek Singh fra GEEKEEFY.

Demp lyd automatisk
Åpne Notisblokk og lim inn følgende;
[cmdletbinding()] Param() #Adding definitions for accessing the Audio API Add-Type -TypeDefinition @" using System.Runtime.InteropServices; [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IAudioEndpointVolume { // f(), g(), ... are unused COM method slots. Define these if you care 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(); // Unused 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)); } } } "@ -Verbose While($true) { #Clean all events in the current session since its in a infinite loop, to make a fresh start when loop begins Get-Event | Remove-Event -ErrorAction SilentlyContinue #Registering the Event and Waiting for event to be triggered Register-WmiEvent -Class Win32_DeviceChangeEvent Wait-Event -OutVariable Event |Out-Null $EventType = $Event.sourceargs.newevent | ` Sort-Object TIME_CREATED -Descending | ` Select-Object EventType -ExpandProperty EventType -First 1 #Conditional logic to handle, When to Mute/unMute the machine using Audio API If($EventType -eq 3) { [Audio]::Mute = $true Write-Verbose "Muted [$((Get-Date).tostring())]" } elseif($EventType -eq 2 -and [Audio]::Mute -eq $true) { [Audio]::Mute = $false Write-Verbose "UnMuted [$((Get-Date).tostring())]" } }
Lagre den med PS1-filtypen. Forsikre deg om at du velger ‘Alle filer’ fra rullegardinmenyen for filtypen. Gi filen et navn som raskt kan fortelle deg hva den gjør. Lagre det et sted du sannsynligvis ikke vil slette det ved et uhell, men også der du lett kan finne det hvis du trenger det.
Kjører manuset
PowerShell kan ikke bare autorisere et skript. Det er et innebygd sikkerhetstiltak som forhindrer det i å gjøre det, men det er en vei rundt det. Vi har en detaljert artikkel om hvordan du kan gjøre akkurat det. Følg instruksjonene for å kjøre PowerShell-skriptet du nettopp opprettet, og bruk en planlagt oppgave til å starte skriptet hver gang du starter PCen.
Alternativt kan du kjøre skriptet manuelt når du starter opp systemet. Jeg har brukt det i mindre enn 30 minutter, og jeg vet ikke hvordan jeg levde uten det før.
kommentarer