Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HowTo Disable WebBrowser 'Click Sound' in your app only

Tags:

c#

.net

winforms

The 'click sound' in question is actually a system wide preference, so I only want it to be disabled when my application has focus and then re-enable when the application closes/loses focus.

Originally, I wanted to ask this question here on stackoverflow, but I was not yet in the beta. So, after googling for the answer and finding only a little bit of information on it I came up with the following and decided to post it here now that I'm in the 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;             }         }     } } 

Then in the main form we use the above code in these 3 events:

  • Activated
  • Deactivated
  • 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; } 

The one problem I see currently is if the program crashes they won't have the click sound until they re-launch my application, but they wouldn't know to do that.

What do you guys think? Is this a good solution? What improvements can be made?

like image 698
sieben Avatar asked Aug 13 '08 23:08

sieben


1 Answers

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); } 
like image 103
John black Avatar answered Sep 22 '22 03:09

John black