visual tutorial studio programacion español descargar c# .net winforms

c# - tutorial - windows forms visual studio 2017



Cómo deshabilitar WebBrowser ''Click Sound'' solo en su aplicación (5)

El ''clic de sonido'' en cuestión es en realidad una preferencia de todo el sistema, por lo que solo quiero que se deshabilite cuando mi aplicación tenga foco y luego volver a habilitar cuando la aplicación cierre / pierda el foco.

Originalmente, quería hacer esta pregunta aquí en stackoverflow, pero aún no estaba en la versión beta. Entonces, después de buscar en Google la respuesta y encontrar solo un poco de información sobre ella, se me ocurrió lo siguiente y decidí publicarlo aquí ahora que estoy en la versión beta.

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

Luego, en la forma principal, usamos el código anterior en estos 3 eventos:

  • Activado
  • Desactivado
  • 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; }

El único problema que veo actualmente es que si el programa falla, no tendrán el sonido de clic hasta que vuelvan a ejecutar mi aplicación, pero no sabrían hacer eso.

¿Qué piensan ustedes? ¿Es esta una buena solución? ¿Qué mejoras se pueden hacer?


Definitivamente se siente como un truco, pero después de haber investigado algo sobre esto hace mucho tiempo y no encontrar ninguna otra solución, probablemente sea tu mejor opción.

Mejor aún sería diseñar su aplicación para que no requiera muchas recarga de páginas molestas ... por ejemplo, si está actualizando un iframe para buscar actualizaciones en el servidor, utilice en su lugar XMLHttpRequest. (¿Puedes decir que estaba lidiando con este problema en los días previos a la acuñación del término "AJAX"?)


Me he dado cuenta de que si utiliza WebBrowser.Document.Write en lugar de WebBrowser.DocumentText, el sonido de clic no ocurre.

Entonces en vez de esto:

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

prueba esto:

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


Si desea reemplazar el Registro de Windows, use esto:

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


Lo deshabilita cambiando el valor de registro de Internet Explorer del sonido de navegación a "NULL":

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

Y habilítelo cambiando el valor de registro de Internet Explorer del sonido de navegación a "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");


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