Comment désactiver le « clic sonore » du navigateur Web dans votre application uniquement

StackOverflow https://stackoverflow.com/questions/10456

  •  08-06-2019
  •  | 
  •  

Question

Le « son de clic » en question est en fait une préférence à l'échelle du système, je souhaite donc qu'il soit désactivé uniquement lorsque mon application a le focus, puis réactivé lorsque l'application se ferme/perd le focus.

A l'origine, je voulais poser cette question ici sur stackoverflow, mais je n'étais pas encore en version bêta.Ainsi, après avoir recherché la réponse sur Google et trouvé seulement quelques informations à ce sujet, j'ai trouvé ce qui suit et j'ai décidé de la publier ici maintenant que je suis dans la version bêta.

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, dans le formulaire principal, nous utilisons le code ci-dessus dans ces 3 événements :

  • Activé
  • Désactivé
  • FormulaireFermeture

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

Le seul problème que je vois actuellement est que si le programme plante, ils n'entendront pas le clic jusqu'à ce qu'ils relancent mon application, mais ils ne sauront pas le faire.

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

Était-ce utile?

La solution

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

Donc au lieu de ça :

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

essaye ça:

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

Autres conseils

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

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

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

Et activez-le en modifiant la valeur de registre du son de navigation d'Internet Explorer en "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");

Cela ressemble vraiment à un hack, mais après avoir fait des recherches à ce sujet il y a longtemps et ne pas avoir trouvé d'autres solutions, c'est probablement votre meilleur pari.

Mieux encore, ce serait de concevoir votre application de manière à ce qu'elle ne nécessite pas de nombreux rechargements de pages ennuyeux.par exemple, si vous actualisez une iframe pour vérifier les mises à jour sur le serveur, utilisez plutôt XMLHttpRequest.(Pouvez-vous dire que j'étais confronté à ce problème avant que le terme « AJAX » ne soit inventé ?)

Si vous souhaitez remplacer le 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top