2008-08-13 11 views
27

問題の「クリック音」は実際にはシステム全体の設定であるため、アプリケーションにフォーカスがあるときは無効にしてから、アプリケーションが終了すると再び有効にします/フォーカスを失う。WebBrowserを無効にする方法アプリケーションでのみ「クリックサウンド」

元々、私はこの問題をstackoverflowでここに聞きたいと思っていましたが、まだベータ版ではありませんでした。だから、答えを求めてグーグルで情報を見つけ出したら、私は次のことを思いついて、私がベータ版になった今ここに投稿することに決めました。

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

Thの無効化有効化:

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

は次にメインフォームで、私たちは、これらの3つのイベントで上記のコードを使用します私が現在見ている1つの問題は、プログラムがクラッシュした場合、アプリケーションを再起動するまでクリック音が鳴りませんが、そのことを知らないことです。

あなたはどう思いますか?これは良い解決策ですか?どのような改善ができますか?

+0

私はこの行に問題がありました:isEnabled = value; 私はちょうどそれをコメントしましたが、それが意図されていたことを知りたいのですが、 – Cristo

答えて

12

WebBrowser.DocumentTextではなくWebBrowser.Document.Writeを使用すると、クリック音が発生しないことに気付きました。だからではなく、本の

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

はこれを試してみてください。

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

あなたの提案された解決策は、コントロールがそのクリックノイズを発生させないようにします。私の場合、Webブラウザコントロールはイベントループの最後にフォーカスを奪ってしまいます。私が知る限り、それに対する回避策はありません。 私の場合、私はDocumentTextソリューションに戻る必要がありました - しかし、私はまだその迷惑なサウンドを無効にするために探しています。他のアイデア? –

+2

ちょうど、このスレッドでは、ジェームズは、知っている:http://stackoverflow.com/questions/393166/how-to-disable-click-sound-in-webbrowser-controlは素晴らしいソリューションを持っています - 少なくともIE7とIE8のために。私はDocumentTextプロパティを使用することができ、フォーカスの問題はありませんし、すべての最高の、私はクリック音がありません。 InterOpの場合は –

0

間違いなくハックのように感じているが、他の解決策を見つけるのに長い時間前にではなく、この上でいくつかの研究を行いました、おそらくあなたの最高の賭け。

あなたのアプリケーションを設計して、多くの厄介なページリロードを必要としないようにする方がいいでしょう。たとえば、iframeをリフレッシュしてサーバー上の更新を確認する場合は、代わりにXMLHttpRequestを使用します。 (?あなたは、私は用語「AJAX」は、鋳造された前の日に戻って、この問題を扱ったことがわかります)

0

あなたはWindowsのレジストリを置き換える使用したい場合は、これを使用する:

// 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); 
39
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); 
} 
+2

+1、これは実際に動作します! – CodeWrite

+0

ありがとう、私はこれが必要でした。 – blez

+1

驚くばかりです、魅力のように動作し、あなたのアプリだけで無効になり、フォームフォーカスに依存しません。 – Josh

1
あなたは「NULL」にサウンドをナビゲートする、Internet Explorerのレジストリ値を変更することで、これを無効

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

そしてC」にサウンドをナビゲートする、Internet Explorerのレジストリ値を変更することで、これを有効に:\ WINDOWS \メディア\街並\ WindowsのN avide Start.wav ":

Registry.SetValue("HKEY_CURRENT_USER\\AppEvents\\Schemes\\Apps\\Explorer\\Navigating\\.Current","","C:\Windows\Media\Cityscape\Windows Navigation Start.wav"); 
+0

これは質問にも適用されません.... – ObieMD5

関連する問題