Cum să dezactivați aplicația WebBrowser "Click Sound" numai în aplicația dvs.

"Sunetul de clic" în cauză este, de fapt, o preferință la nivel de sistem, așadar vreau doar să fie dezactivat atunci când aplicația mea se concentrează și apoi reactivează atunci când aplicația închide/pierde focalizarea.

Inițial, am vrut să pun această întrebare aici pe stackoverflow, dar nu am fost încă în beta. Deci, după ce am răspuns la răspuns și am găsit doar câteva informații despre el, am venit cu următorul text și am decis să îl post pe care îl am aici acum, când sunt în beta.

using System;
using Microsoft.Win32;

namespace HowTo
{
    class WebClickSound
    {
        /// 
        /// Enables or disables the web browser navigating click sound.
        /// 
        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;
            }
        }
    }
}

Apoi, în forma principală vom folosi codul de mai sus în aceste 3 evenimente:

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

Singura problemă pe care o văd în prezent este că în cazul în care programul se blochează, nu va avea sunetul de clic până când nu-și relansează aplicația, dar nu ar ști să facă acest lucru.

Voi ce credeți? Este o soluție bună? Ce îmbunătățiri pot fi făcute?

0
fr hi bn
Am avut o problemă cu această linie: isEnabled = value; Tocmai am comentat-o, dar vreau să știu ce intenționa să fie
adăugat autor Cristo, sursa

5 răspunsuri

Cu siguranta se simte ca un hack, dar dupa ce a facut ceva cercetari despre asta cu mult timp in urma si nu a gasit alte solutii, probabil cel mai bun pariu.

Mai bine ar fi proiectarea aplicației dvs., astfel încât aceasta nu necesită multe reîncărcări enervante ale paginii .. De exemplu, dacă actualizați o iframe pentru a verifica actualizările de pe server, utilizați în schimb XMLHttpRequest. (Puteți să spuneți că am avut de-a face cu această problemă în zilele dinainte de începerea termenului "AJAX"?)

0
adăugat

Am observat că dacă utilizați WebBrowser.Document.Write în loc de WebBrowser.DocumentText, sunetul de clic nu se întâmplă.

Deci, în loc de asta:

webBrowser1.DocumentText = "

Hello, world!

";

incearca asta:

webBrowser1.Document.OpenNew(true);
webBrowser1.Document.Write("

Hello, world!

");
0
adăugat
soluția sugerată de dvs. împiedică controlul să facă acest zgomot pe clic, dar pe de altă parte, această abordare determină faptul că controlul are probleme serioase de focalizare. În cazul meu, controlul webbrowser fură înapoi focalizarea la sfârșitul ciclului de eveniment. În măsura în care pot spune că nu există soluții pentru asta. În cazul meu, trebuia să mă întorc la soluția DocumentText - dar totuși caut să dezactivez sunetul enervant. Orice alte idei?
adăugat autor Stefan Koell, sursa
Doar am aflat că James pe acest thread: stackoverflow.com/questions/393166/… are o soluție excelentă - cel puțin pentru IE7 și IE8. Pot folosi proprietatea DocumentText, nu am probleme de focalizare și cel mai bine, nu am sunet de clic.
adăugat autor Stefan Koell, sursa
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);
}
0
adăugat
O soluție plăcută, funcționează perfect.
adăugat autor m.qayyum, sursa
+1 pentru modul InterOp, aceasta funcționează de fapt!
adăugat autor CodeWrite, sursa
Mulțumesc, ai nevoie de asta.
adăugat autor blez, sursa
O soluție excelentă! Mulțumesc foarte mult!
adăugat autor Connum, sursa
Awesome, funcționează ca un farmec și o dezactivează doar pentru aplicația dvs. și nu se bazează pe focalizarea formularului.
adăugat autor Josh, sursa
Marcat ca răspuns
adăugat autor Marcky, sursa

Dacă doriți să utilizați înlocuirea Windows Registry, utilizați această opțiune:

// 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);
0
adăugat

Dezactivați-l prin modificarea valorii registrului Internet Explorer de navigare a sunetului la "NULL":

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

Și activați-o prin modificarea valorii registrului Internet Explorer pentru navigarea sunetului la "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");
0
adăugat
Acest lucru nu se aplică nici măcar întrebării ...
adăugat autor ObieMD5, sursa