Как отключить WebBrowser ‘Click Sound’ только в вашем приложении

«Click sound», о котором идет речь, на самом деле является общесистемным предпочтением, поэтому я только хочу, чтобы он был отключен, когда мое приложение имеет фокус, а затем повторно включить, когда приложение закрывается/теряет фокус.

Первоначально я хотел задать этот вопрос здесь, на stackoverflow, но я еще не был в бета-версии. Итак, после того, как я погуглил для ответа и нашел только немного информации о нем, я придумал следующее и решил опубликовать его здесь теперь, когда я в бета-версии.

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(@"AppEventsSchemesAppsExplorerNavigating.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(@"AppEventsSchemesAppsExplorerNavigating.Current", true);
                key.SetValue(null, keyValue,  RegistryValueKind.ExpandString);
                isEnabled = value;
            }
        }
    }
}

Затем в основной форме мы используем приведенный выше код в этих 3 событиях:

  • Активированный
  • Дезактивированный
  • FormClosing

    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;
    }
    

Одна проблема, которую я вижу в настоящее время, заключается в том, что если программа аварийно завершает работу, у них не будет звука щелчка, пока они не перезапустят мое приложение, но они не будут знать, чтобы сделать это.

Что вы думаете, ребята? Это хорошее решение? Какие улучшения можно сделать?

5 ответов

  1. Я заметил, что если вы используете WebBrowser.Документ.Пишите, а не WebBrowser.DocumentText тогда щелчок звук не происходит.

    Так что вместо этого:

    webBrowser1.DocumentText = "<h1>Hello, world!</h1>";
    

    попробовать это:

    webBrowser1.Document.OpenNew(true);
    webBrowser1.Document.Write("<h1>Hello, world!</h1>");
    
  2. Безусловно, чувствует себя хак, но, сделав некоторые исследования по этому вопросу давно и не находя никаких других решений, вероятно, ваш лучший выбор.

    Еще лучше было бы разработать приложение, чтобы оно не требовало много раздражающих перезагрузок страницы.. например, если вы обновляете iframe для проверки наличия обновлений на сервере, используйте XMLHttpRequest вместо этого. (Можете ли вы сказать, что я занимался этой проблемой в те дни, когда термин «AJAX» еще не был придуман?

  3. Если вы хотите использовать замену реестра 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);
    
  4. 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);
    }
    
  5. Его можно отключить, изменив значение реестра Internet Explorer для навигации sound на » NULL»:

    Registry.SetValue("HKEY_CURRENT_USER\AppEvents\Schemes\Apps\Explorer\Navigating\.Current","","NULL");
    

    И включите его, изменив значение реестра Internet Explorer навигации sound на «C:\Windows\Media\Cityscape\Windows начало навигации.wav»:

    Registry.SetValue("HKEY_CURRENT_USER\AppEvents\Schemes\Apps\Explorer\Navigating\.Current","","C:\Windows\Media\Cityscape\Windows Navigation Start.wav");