2008-08-13 23 views
27

Le 'clic sonore' en question est en fait une préférence pour le système, je veux donc qu'il soit désactivé lorsque mon application a le focus, puis réactivez-le lorsque l'application se ferme/perd le focus.Comment désactiver WebBrowser 'Click Sound' dans votre application uniquement

A l'origine, je voulais poser cette question ici sur stackoverflow, mais je n'étais pas encore en beta. Donc, après avoir cherché la réponse et trouvé un peu d'information, j'ai trouvé ce qui suit et j'ai décidé de le poster ici maintenant que je suis en 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; 
      } 
     } 
    } 
} 

ensuite sous la forme principale que nous utilisons le code ci-dessus dans ces 3 événements:

  • Activated
  • Désactivé
  • 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 L'un des problèmes que je vois actuellement est que si le programme se bloque, ils n'auront pas le son du clic jusqu'à ce qu'ils relancent mon application, mais ils ne sauraient pas le faire.

Qu'en pensez-vous? Est-ce une bonne solution? Quelles améliorations peuvent être faites?

+0

J'ai rencontré un problème avec cette ligne: isEnabled = value; Je viens de le commenter, mais je veux savoir ce qu'il était censé être – Cristo

Répondre

12

J'ai remarqué que si vous utilisez WebBrowser.Document.Write plutôt que WebBrowser.DocumentText, le son de clic ne se produit pas.

Ainsi, au lieu de cela:

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

essayez ceci:

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

votre solution suggérée empêche le contrôle de faire ce bruit de clic, mais de l'autre côté cette approche provoque le contrôle d'avoir des problèmes de mise au point sérieux.Dans mon cas, le contrôle webbrowser récupère le focus à la fin de la boucle d'événement. Autant que je sache, il n'y a pas de solution pour cela. Dans mon cas, je devais revenir à la solution DocumentText - mais je cherche toujours à désactiver ce son ennuyeux. D'autres idées? –

+2

Juste découvert, que James sur ce fil: http://stackoverflow.com/questions/393166/how-to-disable-click-sound-in-webbrowser-control a une bonne solution - au moins pour IE7 et IE8. Je peux utiliser la propriété DocumentText, ne pas avoir de problèmes de mise au point et le meilleur de tous, je n'ai aucun son de clic. –

0

se sent vraiment comme un hack, mais après avoir fait quelques recherches sur ce depuis longtemps et ne pas trouver d'autres solutions, probablement votre meilleur pari. Mieux encore, il concevrait votre application de sorte qu'il ne nécessite pas beaucoup de rechargements de page ennuyeux .. par exemple, si vous actualisez un iframe pour vérifier les mises à jour sur le serveur, utilisez plutôt XMLHttpRequest. (Pouvez-vous dire que je traitais ce problème de retour dans les jours avant le terme « AJAX » a été inventé)

0

Si vous souhaitez utiliser le remplacement de Registre Windows, utilisez ceci:

// 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 pour InterOp Way, cela fonctionne réellement! – CodeWrite

+0

Merci, vous en avais besoin. – blez

+1

Génial, fonctionne comme un charme et ne le désactive que pour votre application et ne dépend pas de la mise en forme. – Josh

1

Vous le désactiver en modifiant la valeur de registre Internet Explorer de navigation du son à "NULL":

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

et l'activer en modifiant la valeur de registre Internet Explorer de navigation son « C: \ Windows \ Media \ Cityscape \ 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

Cela ne s'applique même pas à la question .... – ObieMD5