23

I use Javascript to click a link in the webbrowser control. But I don't want to hear IE's "click" sound.

Is there any way to do this?

P.S.

Community
  • 1
  • 1
dr. evil
  • 26,944
  • 33
  • 131
  • 201

7 Answers7

45

For IE7 and above, you can use this:

int feature = FEATURE_DISABLE_NAVIGATION_SOUNDS;
CoInternetSetFeatureEnabled(feature, SET_FEATURE_ON_PROCESS, true);

using the following DLL imports

private const int FEATURE_DISABLE_NAVIGATION_SOUNDS = 21;
private const int SET_FEATURE_ON_THREAD = 0x00000001;
private const int SET_FEATURE_ON_PROCESS = 0x00000002;
private const int SET_FEATURE_IN_REGISTRY = 0x00000004;
private const int SET_FEATURE_ON_THREAD_LOCALMACHINE = 0x00000008;
private const int SET_FEATURE_ON_THREAD_INTRANET = 0x00000010;
private const int SET_FEATURE_ON_THREAD_TRUSTED = 0x00000020;
private const int SET_FEATURE_ON_THREAD_INTERNET = 0x00000040;
private const int SET_FEATURE_ON_THREAD_RESTRICTED = 0x00000080;

...

[DllImport("urlmon.dll")]
[PreserveSig]
[return:MarshalAs(UnmanagedType.Error)]
static extern int CoInternetSetFeatureEnabled(
int FeatureEntry,
[MarshalAs(UnmanagedType.U4)] int dwFlags,
bool fEnable);

(found on the MS feedback site as a solution from the WPF team: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=345528&wa=wsignin1.0)

James Crowley
  • 3,911
  • 5
  • 36
  • 65
  • 1
    Works perfectly for me on Vista 64 with IE8. – RichieHindle Apr 28 '09 at 08:22
  • 1
    Works for me too, Win7 64bit IE9 (note: the app is 32 bit) – Zmaster Sep 19 '11 at 14:48
  • Works. Vista 64bit IE10. Also if the link to MS feedback site doesn't work, try removing the `&wa=wsignin1.0` or just click here https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=345528 – Sharky Aug 23 '13 at 15:12
13

I have wrapped this functionality into a ready-to-use class. I used part of the information from the selected answer and the MSDN reference.

Hope this is useful to someone.

Usage

URLSecurityZoneAPI.InternetSetFeatureEnabled(URLSecurityZoneAPI.InternetFeaturelist.DISABLE_NAVIGATION_SOUNDS, URLSecurityZoneAPI.SetFeatureOn.PROCESS, false);

URLSecurityZoneAPI

  /// <summary>
  /// Enables or disables a specified Internet Explorer feature control
  /// Minimum availability: Internet Explorer 6.0
  /// Minimum operating systems: Windows XP SP2
  /// </summary>
  internal class URLSecurityZoneAPI
  {

    /// <summary>
    /// Specifies where to set the feature control value
    /// http://msdn.microsoft.com/en-us/library/ms537168%28VS.85%29.aspx
    /// </summary>
    public enum SetFeatureOn : int
    {
      THREAD = 0x00000001,
      PROCESS = 0x00000002,
      REGISTRY = 0x00000004,
      THREAD_LOCALMACHINE = 0x00000008,
      THREAD_INTRANET = 0x00000010,
      THREAD_TRUSTED = 0x00000020,
      THREAD_INTERNET = 0x00000040,
      THREAD_RESTRICTED = 0x00000080
    }

    /// <summary>
    /// InternetFeaturelist
    /// http://msdn.microsoft.com/en-us/library/ms537169%28v=VS.85%29.aspx
    /// </summary>
    public enum InternetFeaturelist : int
    {
      OBJECT_CACHING = 0,
      ZONE_ELEVATION = 1,
      MIME_HANDLING = 2,
      MIME_SNIFFING = 3,
      WINDOW_RESTRICTIONS = 4,
      WEBOC_POPUPMANAGEMENT = 5,
      BEHAVIORS = 6,
      DISABLE_MK_PROTOCOL = 7,
      LOCALMACHINE_LOCKDOWN = 8,
      SECURITYBAND = 9,
      RESTRICT_ACTIVEXINSTALL = 10,
      VALIDATE_NAVIGATE_URL = 11,
      RESTRICT_FILEDOWNLOAD = 12,
      ADDON_MANAGEMENT = 13,
      PROTOCOL_LOCKDOWN = 14,
      HTTP_USERNAME_PASSWORD_DISABLE = 15,
      SAFE_BINDTOOBJECT = 16,
      UNC_SAVEDFILECHECK = 17,
      GET_URL_DOM_FILEPATH_UNENCODED = 18,
      TABBED_BROWSING = 19,
      SSLUX = 20,
      DISABLE_NAVIGATION_SOUNDS = 21,
      DISABLE_LEGACY_COMPRESSION = 22,
      FORCE_ADDR_AND_STATUS = 23,
      XMLHTTP = 24,
      DISABLE_TELNET_PROTOCOL = 25,
      FEEDS = 26,
      BLOCK_INPUT_PROMPTS = 27,
      MAX = 28
    }

    /// <summary>
    /// Enables or disables a specified feature control. 
    /// http://msdn.microsoft.com/en-us/library/ms537168%28VS.85%29.aspx
    /// </summary>            
    [DllImport("urlmon.dll", ExactSpelling = true), PreserveSig, SecurityCritical, SuppressUnmanagedCodeSecurity]
    [return: MarshalAs(UnmanagedType.Error)]
    static extern int CoInternetSetFeatureEnabled(int featureEntry, [MarshalAs(UnmanagedType.U4)] int dwFlags, bool fEnable);

    /// <summary>
    /// Determines whether the specified feature control is enabled. 
    /// http://msdn.microsoft.com/en-us/library/ms537164%28v=VS.85%29.aspx
    /// </summary>
    [DllImport("urlmon.dll", ExactSpelling = true), PreserveSig, SecurityCritical, SuppressUnmanagedCodeSecurity]
    [return: MarshalAs(UnmanagedType.Error)]
    static extern int CoInternetIsFeatureEnabled(int featureEntry, int dwFlags);

    /// <summary>
    /// Set the internet feature enabled/disabled
    /// </summary>
    /// <param name="feature">The feature from <c>InternetFeaturelist</c></param>
    /// <param name="target">The target from <c>SetFeatureOn</c></param>
    /// <param name="enabled">enabled the feature?</param>
    /// <returns><c>true</c> if [is internet set feature enabled] [the specified feature]; otherwise, <c>false</c>.</returns>
    public static bool InternetSetFeatureEnabled(InternetFeaturelist feature, SetFeatureOn target, bool enabled)
    {
      return (CoInternetSetFeatureEnabled((int)feature, (int)target, enabled) == 0);
    }

    /// <summary>
    /// Determines whether the internet feature is enabled.
    /// </summary>
    /// <param name="feature">The feature from <c>InternetFeaturelist</c></param>
    /// <param name="target">The target from <c>SetFeatureOn</c></param>
    /// <returns><c>true</c> if the internet feature is enabled; otherwise, <c>false</c>.
    /// </returns>
    public static bool IsInternetSetFeatureEnabled(InternetFeaturelist feature, SetFeatureOn target)
    {
      return (CoInternetIsFeatureEnabled((int)feature, (int)target) == 0);
    }

  }
Dennis
  • 20,275
  • 4
  • 64
  • 80
  • perfect, thanks so much. NOTE: if you want it to be muted, the last parameter in usage needs to be false. URLSecurityZoneAPI.InternetSetFeatureEnabled(URLSecurityZoneAPI.InternetFeaturelist.DISABLE_NAVIGATION_SOUNDS, URLSecurityZoneAPI.SetFeatureOn.PROCESS, false); – viggity Dec 16 '11 at 00:53
  • Thanks a lot, works fine. Needs to be applied once when application starts. – net_prog Oct 04 '12 at 08:09
  • 3
    Weird, but I had to set the last parameter to true: URLSecurityZoneAPI.InternetSetFeatureEnabled(URLSecurityZoneAPI.InternetFeaturel‌ist.DISABLE_NAVIGATION_SOUNDS, URLSecurityZoneAPI.SetFeatureOn.PROCESS, true); – Leigh Nov 08 '12 at 15:04
  • 1
    If the property is "Disable Navigation Sounds" then it makes sense the boolean would be *true* to disable, and *false* to enable. It's surprising that the property is a negation, though, given Microsoft's best practices guidelines. – JYelton May 08 '13 at 16:37
2

As noted by the comments, and the answer by @James Crowley, it is indeed possible.


If you navigate in IE, and thus that control, you'll get the click. Unless you change the settings, or fake it like that link, then no, you can't get rid of the click.

Community
  • 1
  • 1
Lasse V. Karlsen
  • 380,855
  • 102
  • 628
  • 825
1

I cant make it work on VB.net, tried this:

Private Const FEATURE_DISABLE_NAVIGATION_SOUNDS As Integer = 21
Private Const SET_FEATURE_ON_THREAD As Integer = &H1
Private Const SET_FEATURE_ON_PROCESS As Integer = &H2
Private Const SET_FEATURE_IN_REGISTRY As Integer = &H4
Private Const SET_FEATURE_ON_THREAD_LOCALMACHINE As Integer = &H8
Private Const SET_FEATURE_ON_THREAD_INTRANET As Integer = &H10
Private Const SET_FEATURE_ON_THREAD_TRUSTED As Integer = &H20
Private Const SET_FEATURE_ON_THREAD_INTERNET As Integer = &H40
Private Const SET_FEATURE_ON_THREAD_RESTRICTED As Integer = &H80

Declare Function CoInternetSetFeatureEnabled Lib "urlmon.dll" ( _
ByVal FeatureEntry As Integer, ByVal dwFlags As Long, _
ByVal fEnable As Long) As Long

...

CoInternetSetFeatureEnabled(FEATURE_DISABLE_NAVIGATION_SOUNDS, SET_FEATURE_ON_PROCESS, True)

Edit: Found the problem, its within declaring. True one is:

<SecurityCritical, SuppressUnmanagedCodeSecurity, DllImport("urlmon.dll", ExactSpelling:=True)> _
Public Shared Function CoInternetSetFeatureEnabled(ByVal featureEntry As Integer, ByVal dwFlags As Integer, ByVal fEnable As Boolean) As Integer
End Function

Thanks to dmex at http://msdn.microsoft.com/en-us/library/ms537168%28VS.85%29.aspx

1

Imports System.Runtime.InteropServices < Imports System.Security

qxxx use those imports

anonymous
  • 11
  • 1
0

Your only other option is to mute the computer, but that's hardly a good idea...

Dan Walker
  • 7,123
  • 6
  • 30
  • 24
-1

So this is known limitation then...

Is there any dirty hack / workaround such as hooking sound calls of the ActiveX and disabling them (Not sure if it's possible without going too deep)

dr. evil
  • 26,944
  • 33
  • 131
  • 201
  • It's not a known limitation... it's a feature of the system for the user. As such, the user is control of it. That's like saying that the html page not being able change the color of the IE titlebar is a known limitation. – Robert C. Barth Dec 26 '08 at 00:01
  • 1
    Robert it's a "control" not an application, so it's a limitation. If windows wouldn't provide a way to access certain registry keys that wouldn't be a feature that would be a limitation. – dr. evil Dec 26 '08 at 14:38