یکی از ویژگی‌های مفید ویندوز ۱۰ این است که پروفایل صوتی متفاوتی برای هر یک از وسایل پخش صدا در نظر می‌گیرد. به عبارت دیگر هر یک از اسپیکرها و هدست‌ها و مانیتورهای دارای اسپیکر، زمانی که فعال می‌شوند، بلندی صدای متفاوتی دارند. ممکن است صدای اسپیکر زیاد باشد و صدای هدست کم. زمانی که بین این دو وسیله سوییچ می‌کنید، بلندی صدا به صورت خودکار تنظیم می‌شود.

در ویندوز ۱۰ با یک اسکریپت یا ترفند ساده می‌توان کاری کرد که به محض جدا کردن هدفون، سیستم Mute یا بی‌صدا شود! در ادامه به روش کار می‌پردازیم. با ما باشید.

شاید همیشه صدای اسپیکر را کم می‌کنید تا با جدا کردن هدست و هدفون، ناگهان صدای بلند اسپیکر شما دیگران را غافل‌گیر نکند اما جالب است بدانید که می‌توانید کاری کنید که حین جدا کردن هدست و هدفون، صدای سیستم کاملاً قطع شود. مشابه این ویژگی در وسایل همراه وجود دارد، به عنوان مثال در اغلب پلیرهای موسیقی اندروید، زمانی که هدفون را جدا می‌کنید، پخش موسیقی متوقف می‌شود.

نحوه بی‌صدا یا Mute کردن ویندوز ۱۰ حین جدا کردن هدفون و هدست

برای این کار از اسکریپت ساده‌ای که به کمک PowerShell ویندوز ۱۰ اجرا می‌شود، استفاده می‌کنیم و در واقع نیازی به نصب کردن نرم‌افزاری خاص وجود ندارد. اسکریپت را به کمک Notepad ویندوز با پسوند PS1 ذخیره می‌کنیم و سپس آن را اجرا می‌کنیم. بنابراین ابتدا روی منوی استارت کلیک کنید و عبارت Notepad‌ را تایپ کنید. در نتایج سرچ روی Notepad کلیک کنید تا نرم‌افزار نوت‌پد ویندوز ۱۰ اجرا شود.

دستورات زیر را در نوت‌پد پیست کنید:

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

}

}

روی منوی File کلیک کرده و گزینه‌ی Save as‌ را انتخاب نمایید. در پنجره‌ی ذخیره کردن فایل، ابتدا از منوی کرکره‌ای انتخاب نوع فایل یا Save as Type، گزینه‌ی All files را انتخاب کنید. سپس در فیلد نام فایل و پسوند آن، نام دلخواه به همراه پسوند ps1 را تایپ کنید. محل ذخیره‌سازی فایل را فولدری انتخاب کنید که احتمال حذف کردن تصادفی فایل وجود نداشته باشد.

برای اجرا کردن اسکریپتی که با نام دلخواه و پسوند ps1‌ ذخیره کرده‌اید، می‌توانید یک فایل bat‌ ساده ایجاد کنید. به این منظور یک بار دیگر Notepad ویندوز را اجرا کنید و دستور زیر را در آن پیست کنید و مسیر اسکریپ را وارد کنید:

@ECHO OFF

PowerShell.exe -Command “مسیر اسکریپت”

PAUSE

به عنوان مثال اگر فایل اسکریپت mute.ps1‌ باشد و در روت درایو C‌ ذخیره شده باشد، دستور فوق به این صورت تغییر می‌کند:

@ECHO OFF

PowerShell.exe -Command “C:\mute.ps1”

PAUSE

در ادامه از منوی فایل گزینه‌ی Save As را انتخاب کنید، از منوی کرکره‌ای انتخاب نوع فایل، حالت All Files‌ را انتخاب کنید. نام دلخواهی برای فایل بچ انتخاب کرده و پسوند آن را bat بگذارید. با دبل‌کلیک کردن روی فایلی که سیو می‌کنید، اسکریپت mute.ps1 اجرا می‌شود و از این پس تا زمانی که سیستم ری‌استارت نشده، به محض جدا کردن هدفون، صدای سیستم قطع می‌شود.

برای اجرا کردن خودکار این فایل Bat می‌توانید آن را در فولدر Startup‌ منوی استارت قرار دهید تا نیازی به اجرا کردن همیشگی آن پس از بوت شدن ویندوز نباشد:

برای اطلاعات بیشتر در مورد فایل‌های Bat به مقاله‌ای که قبلاً منتشر کردیم مراجعه کنید: