gpt4 book ai didi

wpf - 在 Windows 10 上禁用绝对音量

转载 作者:行者123 更新时间:2023-12-05 06:48:31 25 4
gpt4 key购买 nike

我需要能够在运行时设置一些设置,而无需重新启动。使用X-Mouse Controls作为指南,我找到了一种以编程方式使用 SystemParametersInfo() 来设置事件窗口跟踪 (SPI_SET_ACTIVEWINDOWTRACKING) 的方法,而不是将窗口提升到焦点上 (SPI_SET_ACTIVEWNDTRKZORDER ),以及事件窗口跟踪超时 (SPI_ACTIVEWNDTRKTIMEOUT)。

所有这三个设置都可以通过注册表项获得,但更改注册表中的值将需要重新启动。另一方面,使用 SystemParamtersInfo() 调用可避免重新启动。

这是其中一个调用的示例:

public static void SetActiveWindowTracking(bool enabled)
{
bool result = NativeMethods.SystemParametersInfo((uint) SPI.SPI_SETACTIVEWINDOWTRACKING, UiParamNoOp, enabled.AsUIntPtr(), SpifWrite);

if (!result)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}

我要解决的下一个设置是禁用蓝牙绝对音量。此设置在注册表中可用,位于 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Bluetooth\Audio\AVRCP\CT。但是,如果我只是简单地改变这个值,我将不得不重新启动以启用我的新设置。我有兴趣在不重新启动的情况下更改此设置,类似于上面的三个设置。有没有我可以调用的函数,SystemParametersInfo() 或类似的东西,它可以让我无需重新启动即可调整此设置?

顺便说一句,我在 C♯ 中使用 WPF 工作。但是,我对其他解决方案持开放态度。

谢谢!

最佳答案

看看这个Windows Audio Core lib对于选项,我添加了 3 种方法。

只需在 Startup 处将其作为批处理文件/CMD 执行即可或 here on SO

- Option 1: Via registry update / powershell, needs reboot

reg add HKLM\SYSTEM\ControlSet001\Control\Bluetooth\Audio\AVRCP\CT /v DisableAbsoluteVolume /t REG_DWORD /d 1 /f

- Option 2: Via code PInvoke

// Declare your PInvoke
private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
private const int WM_APPCOMMAND = 0x319;

[DllImport("user32.dll")]
public static extern IntPtr SendMessageW(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
// Now call it
SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr) APPCOMMAND_VOLUME_MUTE);

- Option 3: Without interop and no 3rd party libs, just windows audio core lib credit simon from here

using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;

namespace SetAppVolumne
{
class Program
{
static void Main(string[] args)
{
const string app = "Mozilla Firefox";

foreach (string name in EnumerateApplications())
{
Console.WriteLine("name:" + name);
if (name == app)
{
// display mute state & volume level (% of master)
Console.WriteLine("Mute:" + GetApplicationMute(app));
Console.WriteLine("Volume:" + GetApplicationVolume(app));

// mute the application
SetApplicationMute(app, true);

// set the volume to half of master volume (50%)
SetApplicationVolume(app, 50);
}
}
}

public static float? GetApplicationVolume(string name)
{
ISimpleAudioVolume volume = GetVolumeObject(name);
if (volume == null)
return null;

float level;
volume.GetMasterVolume(out level);
return level * 100;
}

public static bool? GetApplicationMute(string name)
{
ISimpleAudioVolume volume = GetVolumeObject(name);
if (volume == null)
return null;

bool mute;
volume.GetMute(out mute);
return mute;
}

public static void SetApplicationVolume(string name, float level)
{
ISimpleAudioVolume volume = GetVolumeObject(name);
if (volume == null)
return;

Guid guid = Guid.Empty;
volume.SetMasterVolume(level / 100, ref guid);
}

public static void SetApplicationMute(string name, bool mute)
{
ISimpleAudioVolume volume = GetVolumeObject(name);
if (volume == null)
return;

Guid guid = Guid.Empty;
volume.SetMute(mute, ref guid);
}

public static IEnumerable<string> EnumerateApplications()
{
// get the speakers (1st render + multimedia) device
IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
IMMDevice speakers;
deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers);

// activate the session manager. we need the enumerator
Guid IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID;
object o;
speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o);
IAudioSessionManager2 mgr = (IAudioSessionManager2)o;

// enumerate sessions for on this device
IAudioSessionEnumerator sessionEnumerator;
mgr.GetSessionEnumerator(out sessionEnumerator);
int count;
sessionEnumerator.GetCount(out count);

for (int i = 0; i < count; i++)
{
IAudioSessionControl ctl;
sessionEnumerator.GetSession(i, out ctl);
string dn;
ctl.GetDisplayName(out dn);
yield return dn;
Marshal.ReleaseComObject(ctl);
}
Marshal.ReleaseComObject(sessionEnumerator);
Marshal.ReleaseComObject(mgr);
Marshal.ReleaseComObject(speakers);
Marshal.ReleaseComObject(deviceEnumerator);
}

private static ISimpleAudioVolume GetVolumeObject(string name)
{
// get the speakers (1st render + multimedia) device
IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
IMMDevice speakers;
deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers);

// activate the session manager. we need the enumerator
Guid IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID;
object o;
speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o);
IAudioSessionManager2 mgr = (IAudioSessionManager2)o;

// enumerate sessions for on this device
IAudioSessionEnumerator sessionEnumerator;
mgr.GetSessionEnumerator(out sessionEnumerator);
int count;
sessionEnumerator.GetCount(out count);

// search for an audio session with the required name
// NOTE: we could also use the process id instead of the app name (with IAudioSessionControl2)
ISimpleAudioVolume volumeControl = null;
for (int i = 0; i < count; i++)
{
IAudioSessionControl ctl;
sessionEnumerator.GetSession(i, out ctl);
string dn;
ctl.GetDisplayName(out dn);
if (string.Compare(name, dn, StringComparison.OrdinalIgnoreCase) == 0)
{
volumeControl = ctl as ISimpleAudioVolume;
break;
}
Marshal.ReleaseComObject(ctl);
}
Marshal.ReleaseComObject(sessionEnumerator);
Marshal.ReleaseComObject(mgr);
Marshal.ReleaseComObject(speakers);
Marshal.ReleaseComObject(deviceEnumerator);
return volumeControl;
}
}

[ComImport]
[Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")]
internal class MMDeviceEnumerator
{
}

internal enum EDataFlow
{
eRender,
eCapture,
eAll,
EDataFlow_enum_count
}

internal enum ERole
{
eConsole,
eMultimedia,
eCommunications,
ERole_enum_count
}

[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IMMDeviceEnumerator
{
int NotImpl1();

[PreserveSig]
int GetDefaultAudioEndpoint(EDataFlow dataFlow, ERole role, out IMMDevice ppDevice);

// the rest is not implemented
}

[Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IMMDevice
{
[PreserveSig]
int Activate(ref Guid iid, int dwClsCtx, IntPtr pActivationParams, [MarshalAs(UnmanagedType.IUnknown)] out object ppInterface);

// the rest is not implemented
}

[Guid("77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IAudioSessionManager2
{
int NotImpl1();
int NotImpl2();

[PreserveSig]
int GetSessionEnumerator(out IAudioSessionEnumerator SessionEnum);

// the rest is not implemented
}

[Guid("E2F5BB11-0570-40CA-ACDD-3AA01277DEE8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IAudioSessionEnumerator
{
[PreserveSig]
int GetCount(out int SessionCount);

[PreserveSig]
int GetSession(int SessionCount, out IAudioSessionControl Session);
}

[Guid("F4B1A599-7266-4319-A8CA-E70ACB11E8CD"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IAudioSessionControl
{
int NotImpl1();

[PreserveSig]
int GetDisplayName([MarshalAs(UnmanagedType.LPWStr)] out string pRetVal);

// the rest is not implemented
}

[Guid("87CE5498-68D6-44E5-9215-6DA47EF883D8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface ISimpleAudioVolume
{
[PreserveSig]
int SetMasterVolume(float fLevel, ref Guid EventContext);

[PreserveSig]
int GetMasterVolume(out float pfLevel);

[PreserveSig]
int SetMute(bool bMute, ref Guid EventContext);

[PreserveSig]
int GetMute(out bool pbMute);
}
}

关于wpf - 在 Windows 10 上禁用绝对音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66822021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com