Подтвердить что ты не робот

HowTo Отключить веб-браузер "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(@"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;
            }
        }
    }
}

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

  • Активированный
  • Деактивировано
  • 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;
    }
    

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

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

4b9b3361

Ответ 1

Я заметил, что если вы используете WebBrowser.Document.Write, а не WebBrowser.DocumentText, то звук щелчка не произойдет.

Итак, вместо этого:

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

попробуйте следующее:

webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write("<h1>Hello, world!</h1>");

Ответ 2

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

Ответ 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

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

Лучше всего будет разрабатывать ваше приложение, чтобы оно не требовало много раздражающих перезагрузок страниц. Например, если вы обновляете 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);