5

स्क्रीन रीडर चल रहा है (JAWS) का पता लगाने के लिए कैसे?सी #: स्क्रीन रीडर चल रहा है या नहीं पता कैसे?

जैसा कि मैं .NET 4 में समझता हूं हम AutomationInteropProvider.ClientsAreListeningSystem.Windows.Automation.Provider नामस्थान से उपयोग कर सकते हैं, लेकिन अगर मुझे .NET 2.0 के लिए ऐसा करना है तो क्या होगा?

मैंने ClientsAreListening स्रोत कोड का निरीक्षण करने का प्रयास किया, यह UIAutomationCore.dll लाइब्रेरी से बाहरी RawUiaClientsAreListening विधि को कॉल करता है।

क्या आपके पास कोई विचार है कि .NET 2.0 में JAWS पहचान को कैसे कार्यान्वित किया जाए?

+0

उत्सुक - यदि आप यह निर्धारित करते हैं कि एक स्क्रीनreader चल रहा है तो आप अलग-अलग क्या करना चाहते हैं? ध्यान दें कि कुछ गैर-स्क्रीनreader ऐप्स SPI_SCREENREADER ध्वज सेट कर सकते हैं, ताकि आप झूठी सकारात्मक या नकारात्मक प्राप्त कर सकें। आदर्श रूप से आपके ऐप को इस ध्वज को जांचने के बिना काम करना चाहिए। क्या आप वास्तव में सामान्य रूप से स्क्रीनreaders या JAWS की जांच कर रहे हैं? – BrendanMcK

उत्तर

4

SystemParametersInfo functionSPI_GETSCREENREADER के uiAction को पास करने का उपयोग करें।

आप इस के लिए P/Invoke उपयोग करने के लिए, उदाहरण के लिए की आवश्यकता होगी:

internal class UnsafeNativeMethods 
{ 
    public const uint SPI_GETSCREENREADER = 0x0046; 

    [DllImport("user32.dll", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref bool pvParam, uint fWinIni); 
} 

public static class ScreenReader 
{ 
    public static bool IsRunning 
    { 
     get 
     { 
      bool returnValue = false; 
      if (!UnsafeNativeMethods.SystemParametersInfo(UnsafeNativeMethods.SPI_GETSCREENREADER, 0, ref returnValue, 0)) 
      { 
       throw new Win32Exception(Marshal.GetLastWin32Error(), "error calling SystemParametersInfo"); 
      } 
      return returnValue; 
     } 
    } 
} 

के रूप में इस संपत्ति के किसी भी स्वचालन ग्राहक के लिए सही वापस जाने के लिए, बस पाठकों स्क्रीन नहीं दिखाई देता है यह संभवतः ClientsAreListening संपत्ति का उपयोग कर से बेहतर है।

यह भी देखें:

तुम भी अगर एक स्क्रीन रीडर शुरू होता है WM_SETTINGCHANGE संदेश का पता लगाने के लिए सुनने चाहिए/चल रहा बंद हो जाता है।


अद्यतन (BrendanMcK की टिप्पणी के जवाब में):

इस हालांकि स्पष्ट रूप से के रूप में कई शब्दों में दर्ज नहीं किया जाता, ध्वज का विवरण को देखकर मुझे लगता है कि इस ध्वज के प्रयोजन के अपेक्षाकृत स्पष्ट है :

निर्धारित करता है कि एक स्क्रीन समीक्षक उपयोगिता चल रही है या नहीं। एक स्क्रीन समीक्षक उपयोगिता एक आउटपुट डिवाइस, जैसे भाषण सिंथेसाइज़र या ब्रेल डिस्प्ले को टेक्स्टुअल जानकारी निर्देशित करती है। जब यह ध्वज सेट किया जाता है, तो एक एप्लिकेशन को ऐसी स्थितियों में पाठ्य जानकारी प्रदान करनी चाहिए जहां यह अन्यथा ग्राफिक रूप से जानकारी प्रस्तुत करेगी।

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

इस ध्वज के जवाब में करने योग्य उपयुक्त चीजें add text in order to "read" otherwise intuitive UI state to the user है। यदि कट्टरपंथी आपके यूआई स्क्रीन रीडर को सुलभ बनाने के लिए परिवर्तनों की आवश्यकता है तो संभावना है कि आपका यूआई भी सिग्नल उपयोगकर्ताओं के लिए सहज नहीं है और शायद फिर से सोचने के साथ कर सकता है।

+0

बढ़िया! यह काम करता है! धन्यवाद! –

+1

ध्यान दें कि ग्राहकअनुक्रम केवल आपको उन अभिगम्यता ग्राहकों के बारे में बताता है जो सक्रिय रूप से पहुंच-योग्यता की घटनाओं को सुनते हैं। ऐसे लोग भी हो सकते हैं जो अभी भी पहुंच का उपयोग करें - उदाहरण के लिए। भाषण मान्यता के लिए क्रियाओं के लिए यूआई को स्क्रैप करने के लिए - लेकिन स्क्रैप करने के लिए निर्धारित करने के लिए कुछ अन्य माध्यमों का उपयोग करें, और अभिगम्यता की घटनाओं को न सुनें। संक्षेप में, यह एपीआई केवल आपको यह बताने देता है कि आपको घटनाएं भेजने की आवश्यकता है; यह नहीं कि एक अभिगम्यता क्लाइंट चल रहा है या नहीं। – BrendanMcK

+0

@BrendanMcK इसके विपरीत 'SPI_GETSCREENREADER' बस एक ध्वज है जो स्क्रीन पाठकों द्वारा सेट किया गया है ताकि वे दूसरों को इंगित कर सकें कि वे चल रहे हैं (0 विधि का उपयोग किए बिना) – Justin

संबंधित मुद्दे