Как отключить веб-браузер Click Click только в вашем приложении - PullRequest
27 голосов
/ 14 августа 2008

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

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

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

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

Ответы [ 5 ]

39 голосов
/ 11 января 2011
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);
}
12 голосов
/ 14 августа 2008

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

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

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

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

webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write("<h1>Hello, world!</h1>");
1 голос
/ 24 июля 2013

Вы отключаете его, изменяя значение реестра 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");
0 голосов
/ 04 января 2011

Если вы хотите использовать замену реестра 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 голосов
/ 14 августа 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...