如何仅在您的应用中禁用 Web 浏览器“点击声音”
Posted
技术标签:
【中文标题】如何仅在您的应用中禁用 Web 浏览器“点击声音”【英文标题】:HowTo Disable WebBrowser 'Click Sound' in your app only 【发布时间】:2010-09-05 20:15:33 【问题描述】:有问题的“点击声音”实际上是系统范围的偏好设置,因此我只希望在我的应用程序获得焦点时禁用它,然后在应用程序关闭/失去焦点时重新启用它。
本来我想在***上问这个问题,但我还没有进入测试版。因此,在谷歌搜索答案并仅找到一点点信息后,我想出了以下内容,并决定在我处于测试阶段后将其发布在这里。
using System;
using Microsoft.Win32;
namespace HowTo
class WebClickSound
/// <summary>
/// Enables or disables the web browser navigating click sound.
/// </summary>
public static bool Enabled
get
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"AppEvents\Schemes\Apps\Explorer\Navigating\.Current");
string keyValue = (string)key.GetValue(null);
return String.IsNullOrEmpty(keyValue) == false && keyValue != "\"\"";
set
string keyValue;
if (value)
keyValue = "%SystemRoot%\\Media\\";
if (Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor > 0)
// XP
keyValue += "Windows XP Start.wav";
else if (Environment.OSVersion.Version.Major == 6)
// Vista
keyValue += "Windows Navigation Start.wav";
else
// Don't know the file name so I won't be able to re-enable it
return;
else
keyValue = "\"\"";
// Open and set the key that points to the file
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"AppEvents\Schemes\Apps\Explorer\Navigating\.Current", true);
key.SetValue(null, keyValue, RegistryValueKind.ExpandString);
isEnabled = value;
然后在主窗体中我们在这3个事件中使用上面的代码:
已激活 已停用窗体关闭
private void Form1_Activated(object sender, EventArgs e)
// Disable the sound when the program has focus
WebClickSound.Enabled = false;
private void Form1_Deactivate(object sender, EventArgs e)
// Enable the sound when the program is out of focus
WebClickSound.Enabled = true;
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
// Enable the sound on app exit
WebClickSound.Enabled = true;
我目前看到的一个问题是,如果程序崩溃了,他们在重新启动我的应用程序之前不会有点击声,但他们不知道这样做。
你们怎么看?这是一个好的解决方案吗?可以做哪些改进?
【问题讨论】:
这行有问题:isEnabled = value;我刚刚评论了它,但我想知道它的意图是什么 【参考方案1】:const int FEATURE_DISABLE_NAVIGATION_SOUNDS = 21;
const int SET_FEATURE_ON_PROCESS = 0x00000002;
[DllImport("urlmon.dll")]
[PreserveSig]
[return: MarshalAs(UnmanagedType.Error)]
static extern int CoInternetSetFeatureEnabled(int FeatureEntry,
[MarshalAs(UnmanagedType.U4)] int dwFlags,
bool fEnable);
static void DisableClickSounds()
CoInternetSetFeatureEnabled(FEATURE_DISABLE_NAVIGATION_SOUNDS,
SET_FEATURE_ON_PROCESS,
true);
【讨论】:
太棒了,就像一个魅力,只为你的应用禁用它,不依赖于表单焦点。 很好的解决方案!非常感谢! 标记为答案【参考方案2】:我注意到,如果您使用 WebBrowser.Document.Write 而不是 WebBrowser.DocumentText,则不会出现点击声音。
所以不要这样:
webBrowser1.DocumentText = "<h1>Hello, world!</h1>";
试试这个:
webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write("<h1>Hello, world!</h1>");
【讨论】:
您建议的解决方案可以防止控件发出咔哒声,但另一方面,这种方法会导致控件出现严重的焦点问题。在我的例子中,webbrowser 控件在事件循环结束时夺回了焦点。据我所知,没有解决方法。就我而言,我需要回到 DocumentText 解决方案——但我仍在寻找禁用那种烦人的声音。还有其他想法吗? 刚刚发现,James 在这个线程:***.com/questions/393166/… 有一个很好的解决方案 - 至少对于 IE7 和 IE8。我可以使用 DocumentText 属性,没有焦点问题,最重要的是,我没有点击声音。【参考方案3】:您可以通过将 Internet Explorer 的导航声音注册表值更改为“NULL”来禁用它:
Registry.SetValue("HKEY_CURRENT_USER\\AppEvents\\Schemes\\Apps\\Explorer\\Navigating\\.Current","","NULL");
并通过将 Internet Explorer 的导航声音注册表值更改为“C:\Windows\Media\Cityscape\Windows Navigation Start.wav”来启用它:
Registry.SetValue("HKEY_CURRENT_USER\\AppEvents\\Schemes\\Apps\\Explorer\\Navigating\\.Current","","C:\Windows\Media\Cityscape\Windows Navigation Start.wav");
【讨论】:
【参考方案4】:绝对感觉像是一个 hack,但很久以前对此进行了一些研究,但没有找到任何其他解决方案,这可能是您最好的选择。
更好的是设计您的应用程序,这样它就不需要许多烦人的页面重新加载。例如,如果您正在刷新 iframe 以检查服务器上的更新,请改用 XMLHttpRequest。 (你能告诉我在“AJAX”这个词被创造出来之前的日子里我正在处理这个问题吗?)
【讨论】:
【参考方案5】:如果您想使用替换 Windows 注册表,请使用:
// backup value
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"AppEvents\Schemes\Apps\Explorer\Navigating\.Current");
string BACKUP_keyValue = (string)key.GetValue(null);
// write nothing
key = Registry.CurrentUser.OpenSubKey(@"AppEvents\Schemes\Apps\Explorer\Navigating\.Current", true);
key.SetValue(null, "", RegistryValueKind.ExpandString);
// do navigation ...
// write backup key
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"AppEvents\Schemes\Apps\Explorer\Navigating\.Current", true);
key.SetValue(null, BACKUP_keyValue, RegistryValueKind.ExpandString);
【讨论】:
以上是关于如何仅在您的应用中禁用 Web 浏览器“点击声音”的主要内容,如果未能解决你的问题,请参考以下文章