سؤال

محاولة كتابة PowerShell cmdlet الذي من شأنه كتم الصوت في البداية، ما لم يتم كتمه بالفعل، وإلغاء كتمه في النهاية (فقط إذا لم يتم كتمه في البداية).لم أتمكن من العثور على أي كائن PoweShell أو WMI يمكنني استخدامه.كنت ألعب باستخدام وظائف Win32 مثل auxGetVolume أو auxSetVolume, ، ولكن لم أتمكن من تشغيله تمامًا (كيف تقرأ القيم من IntPtr؟).

أنا أستخدم V2 CTP2.أي أفكار الناس؟

شكرًا!

هل كانت مفيدة؟

المحلول

وهناك لا يبدو أن يكون وسيلة سهلة وسريعة لضبط حجم الصوت .. إذا كان لديك ج ++ الخبرة، يمكنك أن تفعل شيئا مع <لأ href = "http://blogs.msdn.com/larryosterman/archive/ 2007/03/06 / كيف دو-I-التغيير-ث-الماجستير-حجم-في النوافذ vista.aspx "يختلط =" noreferrer "> هذا بلوق وظيفة ، حيث يصف لاري اوستيرمان كيفية استدعاء واجهة IAudioEndpointVolume من المعهد برنامج (لفيستا، قد يكون أكثر صعوبة من ما وجدتها في عدد قليل من عمليات البحث XP).

وV2 لا تسمح لك ترجمة التعليمات البرمجية المضمنة (عن طريق إضافة نوع)، لذلك قد يكون خيارا.

نصائح أخرى

والبدء مع ويندوز فيستا لديك لاستخدام في الأساسية API الصوت للسيطرة على حجم النظام. انها API COM لا يدعم أتمتة وبالتالي يتطلب الكثير من المتداول استخدامها من. NET و PowerShell.

وعلى أي حال رمز رفع الصوت عاليا تمكنك من الوصول إلى [Audio]::Volume و[Audio]::Mute الخصائص من بوويرشيل. هذا العمل أيضا على جهاز كمبيوتر عن بعد والتي يمكن أن تكون مفيدة. مجرد نسخ ولصق التعليمات البرمجية في إطار بوويرشيل الخاص بك.

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)); }
  }
}
'@

وعينة الاستخدام:

PS C:\> [Audio]::Volume         # Check current volume (now about 10%)
0,09999999
PS C:\> [Audio]::Mute           # See if speaker is muted
False
PS C:\> [Audio]::Mute = $true   # Mute speaker
PS C:\> [Audio]::Volume = 0.75  # Set volume to 75%
PS C:\> [Audio]::Volume         # Check that the changes are applied
0,75
PS C:\> [Audio]::Mute
True
PS C:\>

وهناك مغلفة. NET أكثر شمولا هناك لAPI الأساسية الصوت إذا كنت في حاجة واحدة لكنني لست على بينة من مجموعة من أوامر cmdlets دية بوويرشيل.

P.S. ديوغو الإجابة يبدو ذكي ولكنه لا يعمل بالنسبة لي.

استخدم الأوامر التالية على سيناريو بوويرشيل PS1:

$obj = new-object -com wscript.shell 
$obj.SendKeys([char]173)

والجواب الكسندر لتناسب وضعي، ولكن مثاله لا تعمل بسبب أخطاء ترجمة بشأن مساحة اسم "فار". ويبدو أن أحدث إصدارات / مختلفة من صافي قد يتسبب سبيل المثال لا للعمل. إذا وجدت بأنك تلقيت أخطاء ترجمة، وهذا هو صيغة بديلة في محاولة لتلك الحالات:

Add-Type -Language CsharpVersion3 -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)); }
  }
}
'@

والاستخدام هو نفسه:

PS C:\> [Audio]::Volume         # Check current volume (now about 10%)
0,09999999
PS C:\> [Audio]::Mute           # See if speaker is muted
False
PS C:\> [Audio]::Mute = $true   # Mute speaker
PS C:\> [Audio]::Volume = 0.75  # Set volume to 75%
PS C:\> [Audio]::Volume         # Check that the changes are applied
0,75
PS C:\> [Audio]::Mute
True
PS C:\>

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

ولم أجد كيفية القيام بذلك في بوويرشيل، ولكن هناك دعا NirCmd أداة أوامر من شأنها أن تفعل خدعة عن طريق تشغيل هذا الأمر:

وC: \ تيلس \ nircmd.exe mutesysvolume 2

وNirCmd هو متاح مجانا هنا: http://www.nirsoft.net/utils/nircmd.html

والحل في VBScript:

Set WshShell = CreateObject("WScript.Shell")
For i = 0 To 50
  WshShell.SendKeys(chr(174))
  WScript.Sleep 100
Next

ومفاتيح تقلل من حجم التداول بنسبة 2 في كل مرة.

أعلم أنه ليس PowerShell، ولكن الجمع بين الإجابات من Michael وDiogo يعطي حل VBScript من سطر واحد:

CreateObject("WScript.Shell").SendKeys(chr(173))

صفعة هذا في mute.vbs, ، ويمكنك فقط النقر نقرًا مزدوجًا لتبديل كتم الصوت

  • لا يزال يعمل في نظام التشغيل Windows 10 (10586.104)
  • لا تحتاج الى Set-ExecutionPolicy كما تفعل مع PowerShell

وراجع ردي على تغيير مستوى الصوت من بوويرشيل؟

Set-DefaultAudioDeviceMute
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top