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



تابع قناة عالم الكمبيوتر علي التيليجرام


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



هذا شيء تفعله الهواتف المحمولة، على سبيل المثال، عندما تقوم بفصل سماعات الرأس، تتوقف الموسيقى تلقائيًا. يتمثل المنطق وراء ذلك في أنك إما انتهيت من الاستماع إلى الموسيقى أو أزلت سماعات الرأس عن طريق الخطأ وكنت بحاجة إلى طريقة سريعة لإيقاف تشغيلها، تم كتابة السكربت بشكل أساسي على هذا المبدأ نفسه، افتح المفكرة وقم بلصق السكربت التالي :
[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())]"
}
}

انشئ ملف نصي "txt" جديد، قم بلصق السكربت بداخله :



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



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

السكربت يكون على الشكل التالي :
@ECHO OFF
PowerShell.exe -Command "Path to script"

استبدل عبارة "Path to script" بالمسار الفعلي للبرنامج النصي PowerShell الذي قمنا بأنشائه قبل قليل، خذ بعين الاعتبار المثال التالي : 
@ECHO OFF
PowerShell.exe -Command "C:\Reminder-Scripts\Milk\Buy-Milk.ps1"

افتح المفكرة وقم بلصق البرنامج النصي فيه :


احفظ الملف بامتداد "bat"، ما تفعله هذه الملفات الدفعية هو أنها تفتح PowerShell ثم تشغل النص البرمجي الذي أشرت إليه، سينتج أيضاً ملف بهذا الشكل : 


هكذا نكون قد تحصلنا في النهاية على برنامج نصي دفعي ليشغل البرنامج النصي لل PowerShell الذي قمنا بأعداده في البداية لكتم الصوت تلقائياً في ويندوز 10 عندما تكون سماعات الرأس غير موصولة.

تعليقات