27

問題の「クリック音」は実際にはシステム全体の設定であるため、アプリケーションにフォーカスがあるときにのみ無効にし、アプリケーションが閉じたりフォーカスを失ったりしたときに再度有効にしたい.

もともと、私はここでこの質問をしたかったのですが、まだベータ版ではありませんでした。それで、答えをグーグルで調べて、それに関する情報を少しだけ見つけた後、私は次のことを思いつき、ベータ版になったのでここに投稿することにしました。

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 つのイベントで上記のコードを使用します。

  • アクティブ化
  • 非活動化
  • フォームクロージング

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

私が現在見ている 1 つの問題は、プログラムがクラッシュした場合、アプリケーションを再起動するまでクリック音が聞こえないことですが、彼らはそれを行うことを知りません。

皆さんはどう思いますか?これは良い解決策ですか?どのような改善を行うことができますか?

4

5 に答える 5

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);
}
于 2011-01-11T09:06:31.527 に答える
12

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

したがって、これの代わりに:

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

これを試して:

webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write("<h1>Hello, world!</h1>");
于 2008-08-13T23:10:16.810 に答える
1

これを無効にするには、ナビゲーション サウンドの Internet Explorer レジストリ値を「NULL」に変更します。

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

また、ナビゲーション サウンドの Internet Explorer レジストリ値を「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");
于 2013-07-23T22:38:50.290 に答える
0

確かにハックのように感じますが、これについてずっと前にいくつかの調査を行い、他の解決策を見つけられなかったことが、おそらくあなたの最善の策です.

面倒なページのリロードをあまり必要としないように、アプリケーションを設計することをお勧めします。たとえば、iframe を更新してサーバー上の更新を確認する場合は、代わりに XMLHttpRequest を使用します。(「AJAX」という用語が作られる前に、私がこの問題に取り組んでいたことがわかりますか?)

于 2008-08-13T23:13:02.750 に答える
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);
于 2011-01-03T21:01:02.913 に答える