- - كيفية كتم الصوت تلقائيًا عندما يتم فصل سماعات الرأس في نظام التشغيل Windows 10

كيفية كتم الصوت تلقائيًا عندما يتم فصل سماعات الرأس في نظام التشغيل Windows 10

يمكن لنظام التشغيل Windows 10 الاحتفاظ بملفات تعريف صوت منفصلة لـأجهزة الصوت المختلفة. لكل جهاز صوتي تقوم بتوصيله ، يمكنك ضبط مستوى صوت مختلف وعندما يتم توصيل الجهاز ، سيتم ضبط مستوى الصوت تلقائيًا. بالطبع ، لا أحد يبقي جهاز الصوت صامتًا طوال الوقت. سوف تزيد أو تنقص مستوى الصوت ولكن لا أحد يقوم كتم صوت جهاز صوتي بشكل معتاد. إذا كنت تستخدم زوجًا من سماعات الرأس مع سطح المكتب الخاص بك ، وكان عليك غالبًا فصلها ، فيمكنك استخدام برنامج نصي PowerShell قليل من شأنه كتم الصوت تلقائيًا عند إلغاء توصيل سماعات الرأس.

هذا شيء تفعله الهواتف المحمولة، عندما تقوم بفصل سماعات الرأس ، تتوقف الموسيقى تلقائيًا. المنطق وراء ذلك هو أنك إما استمعت إلى الموسيقى أو قمت بإزالة سماعاتك عن طريق الخطأ وتحتاج إلى طريقة سريعة لإيقافها. تم كتابة السيناريو بشكل أساسي على نفس المبدأ من قبل Prateek Singh من GEEKEEFY.

كتم الصوت تلقائيًا

افتح المفكرة والصق ما يلي ؛

[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())]"
}
}

احفظه بملحق ملف PS1. تأكد من تحديد "All Files" من القائمة المنسدلة لنوع الملف. امنح الملف اسمًا يخبرك في لمحة عما يفعله. احفظه في مكان ما من غير المحتمل أن تحذفه عن طريق الصدفة ولكن أيضًا حيث يمكنك العثور عليه بسهولة إذا كنت بحاجة إلى ذلك.

تشغيل البرنامج النصي

لا يمكن لـ PowerShell تشغيل النص تلقائيًا. هناك إجراء أمني مدمج يمنعه من القيام بذلك ولكن هناك طريقة للتغلب عليه. لدينا مقالة مفصلة حول كيف يمكنك أن تفعل ذلك تماما. اتبع الإرشادات للتشغيل التلقائي للبرنامج النصي PowerShell الذي أنشأته للتو ، واستخدم مهمة مجدولة لبدء البرنامج النصي في كل مرة تقوم فيها بتشغيل جهاز الكمبيوتر الخاص بك.

بدلاً من ذلك ، يمكنك تشغيل البرنامج النصي يدويًا عند تشغيل نظامك. كنت أستخدمها لمدة تقل عن 30 دقيقة ولا أعرف كيف كنت أعيش بدونها من قبل.

تعليقات