2013-01-18 15 views
5

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

अब तक SetWinEventHookEVENT_OBJECT_FOCUS और GetGUIThreadInfoGUI_CARETBLINKING के साथ खोज रहा है।

डॉक्स से

:

EVENT_OBJECT_FOCUS

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

GUI_CARETBLINKING देखभाल का ब्लिंक स्थिति। यह बिट सेट है यदि कैरेट दिखाई दे रहा है।

इन तरीकों मैं इस समाधान के साथ आ गया है का उपयोग करना:

void TextInputHelper::setupEventHook(FREContext iCtx) 
{ 
    ctx = iCtx; 
    CoInitialize(NULL); 

    evHook = SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_END, NULL, 
    handleEventObjectFocus, 0, 0, 
    WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); 

} 


void CALLBACK handleEventObjectFocus(HWINEVENTHOOK hook, DWORD evt, HWND hwnd, 
           LONG idObj, LONG idChild, DWORD thread, DWORD time) 
{ 
    GUITHREADINFO threadInfo; 
    threadInfo.cbSize = sizeof(GUITHREADINFO); 

    BOOL result = GetGUIThreadInfo(thread, &threadInfo); 


    if(threadInfo.flags & GUI_CARETBLINKING) 
    { 

     //text field focus 
    } 


} 

यह कुछ मामलों लेकिन इसकी निश्चित रूप से विश्वसनीय नहीं में काम करने के लिए प्रतीत होता है। नोटपैड जैसे आईई जैसे प्रोग्राम ठीक काम करते हैं लेकिन फ़ायरफ़ॉक्स जैसे अन्य लोग नहीं करते हैं। यह वेबसाइटों पर टेक्स्ट फ़ील्ड जैसी चीज़ों के लिए भी काम नहीं करेगा क्योंकि यह handleEventObjectFocus जैसा नहीं दिखता है।

क्या कोई इस समस्या से निपटने के लिए किसी अन्य तरीके से जानता है? मैं चारों ओर खोज कर रहा हूं और ऐसा लगता है कि मैं एक्सेसिबिलिटी एपीआई में कुछ ढूंढ रहा हूं लेकिन मैं इस पर ज्यादा खोदने में सक्षम नहीं हूं।

धन्यवाद!

संपादित

स्पष्ट करने के लिए, मैं जब फ़ोकस किसी भी पाठ फ़ील्ड में प्रवेश करती है एक सूचना प्राप्त करने के लिए देख रहा हूँ। यह एप्लिकेशन एक Win32 डीएल है और कभी भी अपने आप पर ध्यान केंद्रित नहीं करेगा।

+1

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

उत्तर

1

यदि आप मानक विंडोज नियंत्रण WM_SETFOCUS का उपयोग कर रहे हैं तो यह चाल चलनी चाहिए। हुकिंग इत्यादि के साथ फैंसी पाने की कोई आवश्यकता नहीं है

संपादित करें: सिस्टम विस्तृत व्यवहार के लिए आप SetWindowsHookEx देख सकते हैं। सिस्टम-वाइड घटनाओं को पकड़ने के लिए आपको इसे डीएलएल के भीतर से उपयोग करने की आवश्यकता है। आप WM_SETFOCUS को पकड़ने वाले एक सहित हुक के संयोजन का उपयोग कर सकते हैं।

+2

-1 यह काम करता है यदि आप उस एप्लिकेशन के स्रोत कोड को नियंत्रित करते हैं जिसे आप संशोधित करने जा रहे हैं। यह प्रश्न मौजूदा अनुप्रयोगों के लिए पाठ इनपुट बढ़ाने के बारे में है। – IInspectable

+0

क्षमा करें, लेकिन फिर आपको प्रारंभिक प्रश्न में और अधिक स्पष्ट करने की आवश्यकता है, संपादन देखें। – demorge

+0

धन्यवाद @ डेमोर, टिम सही है मैं वैश्विक ओएस हुक की तलाश में हूं, मैंने मूल प्रश्न में इसे और स्पष्ट करने की कोशिश की। मैं काम के बाद इस पर पढ़ूंगा। क्या आपके पास कोई उदाहरण है? मुझे SetWinHookEx दस्तावेज़ – francis

0

आप EN_SETFOCUS अधिसूचना का उपयोग कर टेक्स्ट फ़ील्ड में प्रवेश प्राप्त कर सकते हैं।

WM_FOCUS विंडो के लिए है, न कि इसमें नियंत्रण के लिए। अन्यथा कहा, यदि आप WM_FOCUS का उपयोग करना चाहते हैं, तो आपको अपने EDIT फ़ील्ड को उप-वर्गीकृत करना होगा। यहां जरूरी नहीं है।

संपादित करें: यह पूरी तरह स्पष्ट नहीं था कि आप एक सिस्टम-व्यापी व्यवहार चाहते थे। उस स्थिति में आपको उपरोक्त उत्तर में समझाए गए अनुसार एक हुक (सीएफ। सेटविंडोशूकएक्स) का उपयोग करना होगा। माफ़ कीजिये।

+2

-1 वही लागू होता है, यह काम करता है यदि आप उस एप्लिकेशन के स्रोत कोड को नियंत्रित करते हैं जिसे आप संशोधित करने जा रहे हैं। यह मामला यहां नहीं है, इसलिए जवाब नहीं है। – IInspectable

1

यदि आप एक वैकल्पिक पाठ इनपुट विधि प्रदान करने की कोशिश कर रहे हैं, तो आपको "आईएमई" - "इनपुट विधि संपादक" में देखना चाहिए। ये सीधे ओएस द्वारा समर्थित हैं।

+0

उदाहरण के लिए [गेम में एक इनपुट विधि संपादक का उपयोग करना] देखें (http://msdn.microsoft.com/en-us/library/windows/desktop/ee419002.aspx)। – IInspectable

+0

धन्यवाद, मैं इसमें देख लूंगा। हालांकि मैं इनपुट के साथ काम नहीं कर रहा हूँ। मैं एक रिमोट क्लाइंट को सूचित करने की कोशिश कर रहा हूं कि अब टेक्स्ट इनपुट पर ध्यान केंद्रित किया गया है। – francis

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