如何仅在您的应用中禁用 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 浏览器“点击声音”的主要内容,如果未能解决你的问题,请参考以下文章

在您的 Web 应用程序中管理执行优先级和请求到期时间

Web Bundles 学习笔记

如何在 UIWebView 中禁用双击事件

您如何在您的网站中实施 quickblox?

如何在 Web 浏览器中启用 Java?

如何在 Web 浏览器中启用 Java?