Comment désactiver le « clic sonore » du navigateur Web dans votre application uniquement
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 ?
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);