2008-08-13 7 views
27

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 se cierre/pierde focoCómo deshabilitar WebBrowser 'Click Sound' en su aplicación solamente

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

Th 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? ¿Es esta una buena solución? ¿Qué mejoras se pueden hacer?

+0

Tuve un problema con esta línea: isEnabled = value; Acabo de comentárselo, pero quiero saber qué fue lo que se pretendía que fuera – Cristo

Respuesta

12

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

Así que en lugar de esto:

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

probar esto:

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

. Su solución sugerida evita que el control produzca ese ruido de clic pero, por otro lado, este enfoque hace que el control tenga graves problemas de enfoque.En mi caso, el control del webbrowser le quita el foco al final del ciclo de eventos. Por lo que puedo decir, no hay solución para eso. En mi caso, necesitaba volver a la solución DocumentText, pero aún estoy buscando la desactivación de ese sonido molesto. ¿Alguna otra idea? –

+2

Acabo de descubrir, que James en este hilo: http://stackoverflow.com/questions/393166/how-to-disable-click-sound-in-webbrowser-control tiene una gran solución, al menos para IE7 e IE8. Puedo usar la propiedad DocumentText, no tengo problemas de enfoque y, lo mejor de todo, no tengo sonido de clic. –

0

Definitivamente se siente como un truco, pero después de haber hecho algunas investigaciones sobre esto hace mucho tiempo y no encontrar ninguna otra solución, Probablemente su mejor apuesta.

Mejor aún sería diseñar su aplicación para que no requiera muchas recarga de páginas molestas ... por ejemplo, si está refrescando un iframe para buscar actualizaciones en el servidor, utilice en su lugar XMLHttpRequest. (¿Puede usted decir que yo estaba tratando con este problema en los días antes de que el término "AJAX" fue acuñado)

0

Si desea utilizar la sustitución de registro de Windows, utilice la siguiente:

// 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); 
39
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); 
} 
+2

+1 para la forma InterOp, ¡esto realmente funciona! – CodeWrite

+0

Gracias, tú, yo necesitaba esto. – blez

+1

Impresionante, funciona como un amuleto y solo lo deshabilita solo para su aplicación y no depende del enfoque del formulario. – Josh

1

deshabilita cambiando valor de registro de Internet Explorer de navegación de sonido en "NULO":

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

y permitirle al cambiar valor de registro de Internet Explorer de navegación de sonido en "C: \ Windows \ Media \ paisaje urbano \ Windows N avigation Start.wav ":

Registry.SetValue("HKEY_CURRENT_USER\\AppEvents\\Schemes\\Apps\\Explorer\\Navigating\\.Current","","C:\Windows\Media\Cityscape\Windows Navigation Start.wav"); 
+0

Esto ni siquiera se aplica a la pregunta .... – ObieMD5