Как отключить WebBrowser «Звук клика» только в вашем приложении

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

Первоначально я хотел задать этот вопрос здесь на 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;
            }
        }
    }
}

Затем в основной форме мы используем вышеуказанный код в этих 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;
    }

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

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

13.08.2008 23:01:01
У меня была проблема с этой строкой: isEnabled = value; Я только что прокомментировал это, но я хочу знать, что это было задумано
Cristo 31.03.2013 20:57:20
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

попробуй это:

webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write("<h1>Hello, world!</h1>");
12
13.08.2008 23:10:16
предлагаемое вами решение не дает элементу управления создавать такой шум щелчка, но с другой стороны, при таком подходе у элемента управления возникают серьезные проблемы с фокусировкой. В моем случае, элемент управления веб-браузера скрывает фокус в конце цикла событий. Насколько я могу судить, для этого нет обходного пути. В моем случае мне нужно было вернуться к решению DocumentText - но все же я ищу отключение этого раздражающего звука. Есть еще идеи?
Stefan Koell 31.05.2009 09:28:56
Только что выяснил, что Джеймс в этой теме: stackoverflow.com/questions/393166/… имеет отличное решение - по крайней мере для IE7 и IE8. Я могу использовать свойство DocumentText, у меня нет проблем с фокусом и, что самое главное, у меня нет щелчка.
Stefan Koell 31.05.2009 10:23:03

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

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

0
13.08.2008 23:13:02

Если вы хотите использовать замену реестра 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);
0
3.01.2011 21:01:02
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);
}
39
7.02.2016 18:26:47
Удивительно, работает как шарм и отключает его только для вашего приложения и не полагается на фокус формы.
Josh 11.02.2012 10:52:07
Отличное решение! Большое спасибо!
Constantin Groß 20.09.2013 07:14:03
Помечено как ответ
Marcky 27.11.2016 04:40:42

Вы отключите его, изменив значение реестра 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");
1
25.07.2013 22:41:15