कैसे अपने ऐप में WebBrowser 'क्लिक ध्वनि' अक्षम करें

प्रश्न में 'क्लिक ध्वनि' वास्तव में एक प्रणाली की व्यापक वरीयता है, इसलिए मैं केवल तभी अक्षम होना चाहता हूं जब मेरा एप्लिकेशन फोकस हो और फिर जब एप्लिकेशन फोकस बंद/खो देता है तो पुनः सक्षम करें।

मूल रूप से, मैं यहां इस सवाल को स्टैक ओवरफ्लो पर पूछना चाहता था, लेकिन मैं बीटा में अभी तक नहीं था। तो, उत्तर के लिए गुगल करने और इसके बारे में केवल थोड़ी सी जानकारी खोजने के बाद मैं निम्नलिखित के साथ आया और अब इसे पोस्ट करने का फैसला किया कि मैं बीटा में हूं।

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

फिर मुख्य रूप में हम इन 3 घटनाओं में उपरोक्त कोड का उपयोग करते हैं:

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

एक समस्या जो मैं वर्तमान में देखता हूं वह यह है कि यदि प्रोग्राम दुर्घटनाग्रस्त हो जाता है तो उनके पास क्लिक ध्वनि नहीं होगी जब तक कि वे मेरे एप्लिकेशन को फिर से लॉन्च नहीं करते हैं, लेकिन वे ऐसा नहीं करना चाहेंगे।

आप लोग क्या सोचते हैं? क्या यह एक अच्छा समाधान है? क्या सुधार किए जा सकते हैं?

0
ro fr bn
मुझे इस पंक्ति में कोई समस्या थी: isEnabled = value; मैंने अभी टिप्पणी की है, लेकिन मैं जानना चाहता हूं कि इसका क्या इरादा था
जोड़ा लेखक Cristo, स्रोत

5 उत्तर

निश्चित रूप से एक हैक की तरह लगता है, लेकिन इस पर कुछ समय पहले कुछ शोध किया है और कोई अन्य समाधान नहीं ढूंढ रहा है, शायद आपकी सबसे अच्छी शर्त।

बेहतर अभी तक आपके एप्लिकेशन को डिज़ाइन किया जाएगा, इसलिए इसे कई कष्टप्रद पेज रीलोड की आवश्यकता नहीं है .. उदाहरण के लिए, यदि आप सर्वर पर अपडेट की जांच करने के लिए आईफ्रेम रीफ्रेश कर रहे हैं, तो इसके बजाय XMLHttpRequest का उपयोग करें। (क्या आप बता सकते हैं कि "AJAX" शब्द का निर्माण करने से पहले मैं इस समस्या से निपट रहा था?)

0
जोड़ा

मैंने देखा है कि यदि आप WebBrowser.DocumentTrite का उपयोग WebBrowser.DocumentText के बजाय करते हैं तो क्लिक ध्वनि नहीं होती है।

तो इसके बजाय:

webBrowser1.DocumentText = "

Hello, world!

";

इसे इस्तेमाल करे:

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

Hello, world!

");
0
जोड़ा
आपका सुझाया गया समाधान उस शोर पर क्लिक करने से नियंत्रण को रोकता है लेकिन दूसरी ओर यह दृष्टिकोण नियंत्रण को गंभीर फोकस के मुद्दों का कारण बनता है। मेरे मामले में, वेबब्रोसर नियंत्रण इवेंट लूप के अंत में फोकस वापस चुरा लेता है। जहां तक ​​मैं कह सकता हूं कि उसके लिए कोई कामकाज नहीं है। मेरे मामले में मुझे दस्तावेज़ टेक्स्ट समाधान पर वापस जाने की आवश्यकता थी - लेकिन फिर भी मैं उस परेशान ध्वनि को अक्षम करने की तलाश में हूं। कोई अन्य विचार?
जोड़ा लेखक Stefan Koell, स्रोत
बस पता चला कि जेम्स इस धागे पर है: stackoverflow.com/questions/393166/… का एक अच्छा समाधान है - कम से कम आईई 7 और आईई 8 के लिए। मैं DocumentText प्रॉपर्टी का उपयोग कर सकता हूं, कोई फोकस समस्या नहीं है और सबसे अच्छा है, मेरे पास कोई क्लिक ध्वनि नहीं है।
जोड़ा लेखक Stefan Koell, स्रोत
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
जोड़ा
अच्छा समाधान, पूरी तरह से काम करता है।
जोड़ा लेखक m.qayyum, स्रोत
InterOp तरीके के लिए +1, यह वास्तव में काम करता है!
जोड़ा लेखक CodeWrite, स्रोत
धन्यवाद, आपको इसकी आवश्यकता है।
जोड़ा लेखक blez, स्रोत
महान समाधान! आपका बहुत बहुत धन्यवाद!
जोड़ा लेखक Connum, स्रोत
बहुत बढ़िया, एक आकर्षण की तरह काम करता है और केवल आपके ऐप के लिए इसे अक्षम करता है और फॉर्म फोकस पर भरोसा नहीं करता है।
जोड़ा लेखक Josh, स्रोत
उत्तर के रूप में चिह्नित
जोड़ा लेखक Marcky, स्रोत

यदि आप विंडोज रजिस्ट्री को प्रतिस्थापित करना चाहते हैं, तो इसका उपयोग करें:

// 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
जोड़ा

आप "NULL" पर ध्वनि नेविगेट करने के इंटरनेट एक्सप्लोरर रजिस्ट्री मान को बदलकर इसे अक्षम कर देते हैं:

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

और "सी: \ विंडोज \ मीडिया \ सिटीस्केप \ विंडोज नेविगेशन Start.wav" पर ध्वनि नेविगेट करने के इंटरनेट एक्सप्लोरर रजिस्ट्री मान को बदलकर इसे सक्षम करें:

Registry.SetValue("HKEY_CURRENT_USER\\AppEvents\\Schemes\\Apps\\Explorer\\Navigating\\.Current","","C:\Windows\Media\Cityscape\Windows Navigation Start.wav");
0
जोड़ा
यह सवाल पर भी लागू नहीं होता है ....
जोड़ा लेखक ObieMD5, स्रोत