尝试编写一个PowerShell cmdlet,它将在开始时静音,除非已经静音,并在最后取消静音(仅当它没有静音时才开始).找不到我可以使用的任何PoweShell或WMI对象.我正在玩使用像auxGetVolume或auxSetVolume这样的Win32函数,但是无法让它工作(如何从IntPtr中读取值?).
我正在使用V2 CTP2.有什么想法吗?
谢谢!
我的网络浏览器:
XAML:
//...
xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
//...
<my:WindowsFormsHost Name="windowsFormsHost"/>
Run Code Online (Sandbox Code Playgroud)
C#背后的代码:
System.Windows.Forms.WebBrowser Browser = new System.Windows.Forms.WebBrowser();
windowsFormsHost.Child = Browser;
Run Code Online (Sandbox Code Playgroud)
我的问题是如何禁用所有音频输出.
我找到了这个:
C#:
private const int Feature = 21; //FEATURE_DISABLE_NAVIGATION_SOUNDS
private const int SetFeatureOnProcess = 0x00000002;
[DllImport("urlmon.dll")]
[PreserveSig]
[return: MarshalAs(UnmanagedType.Error)]
static extern int CoInternetSetFeatureEnabled(int featureEntry,
[MarshalAs(UnmanagedType.U4)] int dwFlags,
bool fEnable);
Run Code Online (Sandbox Code Playgroud)
它很好,但是这段代码只能禁用"咔嗒"声,所以在这种情况下它的那种无用.
我只想从我的应用程序100%静音,没有声音.
我已经读过,在这个webbrowser中,它需要通过Windows Sounds来完成,但我真的不知道我在代码中无法做到这一点.
我正在StackOverflow上搜索,找到了C#中静音音量的答案.我不明白答案是怎么回事.我从来没有深入到Marshaling或P/Invoke.我之前使用过它们但从未明白我在做什么.
所以这就是我困惑的事情:
private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
private const int WM_APPCOMMAND = 0x319;
Run Code Online (Sandbox Code Playgroud)
在声明这些内容时,它们的名称是否重要,或者它们只是被视为任何整数,无论它们被称为什么?
你在哪里的价值观0x80000
和0x319
从何而来?
我正在使用此代码来静音/取消静音系统主音量:
const
APPCOMMAND_VOLUME_MUTE = $80000;
WM_APPCOMMAND = $319;
procedure TForm1.Button1Click(Sender: TObject);
begin
// toggle mute/unmute
SendMessageW(Handle, WM_APPCOMMAND, Handle, APPCOMMAND_VOLUME_MUTE);
end;
Run Code Online (Sandbox Code Playgroud)
(从/sf/answers/10788991/获取代码)
它在XP上工作正常(还没有在Win7上测试它).
我需要一种方法来检查(获取)当前的"静音"状态?它是否静音.
有任何想法吗?
更新:对于XP,我最终使用了这里的代码:如何在Windows XP中获取主卷?(感谢@Sertac Akyuz)
我不得不改变一行:
mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
Run Code Online (Sandbox Code Playgroud)
至:
mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE;
Run Code Online (Sandbox Code Playgroud)
返回值为0(不是静音)或1(静音).
我正在尝试控制主音量.我能够成功地做到这一点:
HWND mainhwnd = CreateWindow(szWindowClass, _T("window-noit-ext-profilist"), 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, wcex.hInstance, NULL);
if (!mainhwnd) {
MessageBox(NULL, _T("Profilist: Call to CreateWindow failed!"), _T("window-noit-ext-profilist"), NULL);
return 1;
}
SendMessage(mainhwnd, WM_APPCOMMAND, (WPARAM)mainhwnd, (LPARAM)(APPCOMMAND_VOLUME_MUTE * 65536)); // mute
SendMessage(mainhwnd, WM_APPCOMMAND, (WPARAM)mainhwnd, (LPARAM)(APPCOMMAND_VOLUME_DOWN * 65536)); // vol down
SendMessage(mainhwnd, WM_APPCOMMAND, (WPARAM)mainhwnd, (LPARAM)(APPCOMMAND_VOLUME_UP * 65536)); // vol up
Run Code Online (Sandbox Code Playgroud)
为什么我要乘以65,536?文档没有说明这一点.如果我不繁殖,那么它不起作用.
我正在尝试使用标准SendMessageW()
方法从控制台应用程序取消静音.但是,我们有自己的应用程序作为shell运行,而不是explorer.exe.当我试图取消静音时,没有任何反应; 但是一旦我启动资源管理器它就可以了.是否必须运行资源管理器才能发送消息?
码:
private const int APPCOMMAND_VOLUME_MUTE = 0x80000;
private const int WM_APPCOMMAND = 0x319;
SendMessageW(Process.GetCurrentProcess().MainWindowHandle, WM_APPCOMMAND, Process.GetCurrentProcess().MainWindowHandle, (IntPtr)APPCOMMAND_VOLUME_MUTE);
Run Code Online (Sandbox Code Playgroud)
返回值为SendMessageW()
0.
如果需要资源管理器,是否有人知道另一种取消静音方法?
Side Note
我刚刚尝试使用vbs:
Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys(chr(&hAD))
Run Code Online (Sandbox Code Playgroud)
并得到了相同的结果.只有在explorer.exe运行时才取消静音.