Comment désactiver le son du clic dans le contrôle WebBrowser
J'utilise Javascript pour cliquer sur un lien dans le contrôle webbrowser. Mais je ne veux pas entendre le son "clic" D'IE.
Y a-t-il un moyen de le faire?
P.S.
- Je ne veux pas modifier les paramètres du système.
- j'ai vu celui-ci (HowTo Désactiver WebBrowser 'déclic' dans votre application uniquement) et
Document.Write
n'est pas une option pour moi.
7 réponses
Pour IE7 et supérieur, vous pouvez utiliser ceci:
int feature = FEATURE_DISABLE_NAVIGATION_SOUNDS;
CoInternetSetFeatureEnabled(feature, SET_FEATURE_ON_PROCESS, true);
En utilisant les importations DLL suivantes
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);
(trouvé sur le site ms feedback en tant que solution de L'équipe WPF: https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=345528&wa=wsignin1.0)
J'ai enveloppé cette fonctionnalité dans une classe prête à l'emploi. J'ai utilisé une partie des informations de la réponse sélectionnée et la référence MSDN .
J'espère que cela est utile à quelqu'un.
L'Utilisation de
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);
}
}
Comme noté par les commentaires, et la réponse de @ James Crowley , c'est en effet possible.
Si vous naviguez dans IE, et donc ce contrôle, vous obtiendrez le clic. Sauf si vous modifiez les paramètres, ou le faux comme ce lien, alors non, vous ne pouvez pas vous débarrasser du clic.
Je ne peux pas le faire fonctionner sur VB.net, essayé ceci:
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: trouvé le problème, c'est dans la déclaration. Le vrai est:
<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
Grâce à dmex à http://msdn.microsoft.com/en-us/library/ms537168%28VS.85%29.aspx
Système D'Importation.Runtime.InteropServices
Qxxx utilise ces importations
Votre seule autre option est de couper l'ordinateur, mais ce n'est pas une bonne idée...
Donc c'est une limitation connue alors...
Y a-t-il un hack / solution de contournement sale tel que l'accrochage des appels sonores de L'ActiveX et leur désactivation (Je ne sais pas si c'est possible sans aller trop loin)