2008-08-13 15 views
27

Der 'Klick-Sound' in Frage ist eigentlich eine systemweite Einstellung, so dass ich nur deaktiviert werden möchte, wenn meine Anwendung den Fokus hat und dann wieder aktivieren, wenn die Anwendung geschlossen wird/verliert den Fokus.HowTo Deaktivieren WebBrowser 'Klick Sound' nur in Ihrer App

Ursprünglich wollte ich diese Frage hier auf Stackoverflow stellen, aber ich war noch nicht in der Beta. Also, nachdem ich nach der Antwort gegoogelt und nur ein paar Informationen darüber gefunden hatte, kam ich auf das folgende und entschied, es hier zu posten, jetzt wo ich in der Beta bin.

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

dann in der Hauptform verwenden wir den obigen Code in diesen 3 Veranstaltungen

  • Aktiviert
  • Deaktiviert
  • 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 Das einzige Problem, das ich derzeit sehe, ist, wenn das Programm abstürzt, werden sie nicht den Klick-Sound haben, bis sie meine Anwendung neu starten, aber sie würden das nicht tun.

Was denkst du? Ist das eine gute Lösung? Welche Verbesserungen können vorgenommen werden?

+0

Ich hatte ein Problem mit dieser Zeile: isEnabled = Wert; Ich habe es gerade kommentiert, aber ich möchte wissen, was es sein sollte – Cristo

Antwort

12

Ich habe festgestellt, dass wenn Sie WebBrowser.Document.Write statt WebBrowser.DocumentText verwenden, der Klick-Sound nicht auftritt.

Anstatt also diese:

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

try this:

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

Ihre vorgeschlagene Lösung verhindert, dass die Kontrolle dieses Klickgeräusch macht, aber auf der anderen Seite verursacht dieser Ansatz die Kontrolle ernsthafte Fokusprobleme.In meinem Fall stiehlt die Webbrowser-Steuerung den Fokus am Ende der Ereignisschleife. Soweit ich das beurteilen kann, gibt es dafür keine Abhilfe. In meinem Fall musste ich auf die DocumentText-Lösung zurückgreifen - aber ich suche immer noch nach diesem störenden Sound. Irgendwelche anderen Ideen? –

+2

Habe gerade herausgefunden, dass James zu diesem Thema: http://stackoverflow.com/questions/393166/how-to-disable-click-sound-in-webbrowser-control eine tolle Lösung hat - zumindest für IE7 und IE8. Ich kann die DocumentText-Eigenschaft verwenden, habe keine Fokusprobleme und das Beste von allem, ich habe keinen Klick-Sound. –

0

Auf jeden Fall fühlt sich wie ein Hack, aber vor alle anderen Lösungen zu finden und nicht auf diese eine lange Zeit, einige der Forschung getan zu haben, wahrscheinlich deine beste Wette.

Besser noch wäre die Gestaltung Ihrer Anwendung, so dass es nicht viele lästige Seite neu laden benötigt .. zum Beispiel, wenn Sie ein Iframe auf Updates auf dem Server suchen, verwenden Sie stattdessen XMLHttpRequest. (Können Sie sagen, dass ich mit diesem Problem zurück in den Tagen vor der Begriff „AJAX“ wurde geprägt, es zu tun hatte)

0

Wenn Sie Windows-Registrierung verwenden möchten ersetzen, verwenden Sie diese:

// 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 für InterOp Weg, das funktioniert tatsächlich! – CodeWrite

+0

Danke, du hast das gebraucht. – blez

+1

Super, funktioniert wie ein Zauber und deaktiviert nur für Ihre App und ist nicht auf Form Fokus angewiesen. – Josh

1

Sie deaktivieren, indem Sie den Internet Explorer-Registrierungswert Sound der Navigation auf "NULL":

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

Und es ermöglichen, von der Navigation Sound Internet Explorer Registrierungswert ändert auf „C: \ Windows \ Media \ Ansicht \ Windows-N avigation Start.wav ":

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

Dies gilt nicht einmal für die Frage .... – ObieMD5

Verwandte Themen