HowTo Отключают WebBrowser ' Нажмите Sound' в Вашем приложении только

' щелкните по sound' рассматриваемый на самом деле система широкое предпочтение, таким образом, я только хочу, чтобы оно было отключено, когда мое заявление фокусируется, и затем повторно позвольте, когда применение закрывается/теряет центр.

Первоначально, я хотел задать этот вопрос здесь на stackoverflow, но я еще не был в бете. Так, после googling для ответа и нахождения только определенной информации о нем я придумал следующее и решил отправить его здесь теперь, когда I' m в бете.

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

      частный недействительный Form1_Activated (возражают отправителю, EventArgs e),
      {
          //Отключите звук, когда программа сфокусируется
          WebClickSound. Позволенный = ложный;
      }
    
      частный недействительный Form1_Deactivate (возражают отправителю, EventArgs e),
      {
          //Позвольте звук, когда программа будет не в фокусе
          WebClickSound. Позволенный = верный;
      }
    
      частный недействительный Form1_FormClosing (возражают отправителю, FormClosingEventArgs e),
      {
          //Позвольте звук на выходе приложения
          WebClickSound. Позволенный = верный;
      }

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

Что делает Вас, парни думают? Действительно ли это - хорошее решение? Какие улучшения могут быть сделаны?

Комментарии к вопросу (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);
}
Комментарии (6)
Решение

I' ve заметил это, если Вы используете WebBrowser. Документ. Напишите, а не WebBrowser. DocumentText тогда щелчок кажутся doesn' t происходят.

Таким образом вместо этого:

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

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

webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write("<h1>Hello, world!</h1>");
Комментарии (2)

Вы отключаете его, изменяя ценность регистрации 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)

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

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

Комментарии (0)

Если Вы хотите использовать Windows Registry замены, используйте это:

// 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)