2008-08-13 17 views
27

"Dźwięk kliknięcia" to w rzeczywistości preferencja dla całego systemu, więc chcę, aby była wyłączona tylko wtedy, gdy moja aplikacja jest aktywna, a następnie ponownie włączyć po zamknięciu aplikacji./traci koncentrację.HowTo Disable WebBrowser "Kliknij Sound" tylko w Twojej aplikacji

Pierwotnie chciałem zadać to pytanie tutaj na stackoverflow, ale nie byłem jeszcze w wersji beta. Tak więc, po szukaniu odpowiedzi i znalezieniu tylko niewielkiej ilości informacji na ten temat, wymyśliłem poniższe i postanowiłem opublikować go teraz, gdy jestem w wersji beta.

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

Następnie w formularzu głównym możemy użyć powyższego kodu w tych 3 wydarzenia:

  • Activated
  • dezaktywowane
  • 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 Problemem, który obecnie widzę, jest to, że jeśli program się zawiesza, nie usłyszy dźwięku kliknięcia, dopóki ponownie nie uruchomi mojej aplikacji, ale nie będą tego wiedzieć.

Co myślicie? Czy to dobre rozwiązanie? Jakie ulepszenia można wprowadzić?

+0

Miałem problem z tą linią: isEnabled = wartość; Właśnie skomentowałem to, ale chcę wiedzieć, co miało być – Cristo

Odpowiedz

12

Zauważyłem, że jeśli używasz WebBrowser.Document.Write zamiast WebBrowser.DocumentText, dźwięk kliknięcia nie występuje.

tego Więc zamiast:

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

spróbuj tego:

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

Twoje sugerowane rozwiązanie uniemożliwia sterowanie z powodu tego hałasu kliknięcia, ale z drugiej strony to podejście powoduje, że kontrola ma poważne problemy z ustawieniem ostrości.W moim przypadku, kontrola przeglądarki przejmuje skupienie na końcu pętli zdarzeń. O ile mogę powiedzieć, nie ma tego obejścia. W moim przypadku musiałem wrócić do rozwiązania DocumentText - ale wciąż szukam wyłączenia tego denerwującego dźwięku. Jakieś inne pomysły? –

+2

Właśnie się dowiedziałem, że James w tym wątku: http://stackoverflow.com/questions/393166/how-to-disable-click-sound-in-webbrowser-control ma świetne rozwiązanie - przynajmniej dla IE7 i IE8. Mogę używać właściwości DocumentText, nie mam problemów z ogniskiem, a co najważniejsze, nie mam dźwięku kliknięcia. –

0

pewno czuje się jak hack, ale zrobiwszy jakieś badania na ten temat dawno temu i nie znalezienie innych rozwiązań, prawdopodobnie twój najlepszy zakład.

Jeszcze lepiej zaprojektowałbyś swoją aplikację, aby nie wymagała wielu denerwujących przeładowań strony. Na przykład, jeśli odświeżasz element iframe, by sprawdzać aktualizacje na serwerze, użyj zamiast tego XMLHttpRequest. (Czy możesz powiedzieć, że mam do czynienia z tym problemem w czasach przed określenie „AJAX” został ukuty)

0

Jeśli chcesz użyć zastąpienie rejestru systemu Windows, użyj tego:

// 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 za sposób InterOp, to faktycznie działa! – CodeWrite

+0

Dziękuję, potrzebowałem tego. – blez

+1

Niesamowite, działa jak urok i wyłącza go tylko dla Twojej aplikacji i nie opiera się na fokusie. – Josh

1

ją wyłączyć poprzez zmianę wartości rejestru Internet Explorer od nawigowania dźwięk "NULL":

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

umożliwi jej poprzez zmianę wartości rejestru Internet Explorer od nawigowania dźwięk do „C: \ Windows \ media \ Pejzaż \ Windows N Nawigacja Start.wav ":

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

Nie dotyczy to nawet pytania .... – ObieMD5