2009-09-03 14 views
6

मैं एक WPF अनुप्रयोग में इनपुट इंजेक्शन पर काम कर रहा हूं। यह प्रोजेक्ट कड़ी मेहनत करता है कि मुझे पृष्ठभूमि में चलने के बावजूद एप्लिकेशन में इनपुट इंजेक्ट करने में सक्षम होना चाहिए (यानी किसी अन्य एप्लिकेशन में इनपुट फोकस है)। SendInput() फ़ंक्शन का उपयोग इसलिए प्रश्न से बाहर है।WPF अनुप्रयोगों में माउस इनपुट इंजेक्शन

अब तक, मुझे कीबोर्ड इनपुट काम मिल गया है लेकिन मुझे माउस इनपुट इंजेक्शन देने में परेशानी हो रही है।

मैंने माउस संदेशों को भौतिक रूप से क्लिक करते समय WPF विंडो पर भेजे गए विंडो संदेशों का निरीक्षण करने के लिए Spy ++ का उपयोग किया। मैं फिर इन माउस संदेशों को आसानी से तैयार करता हूं (जैसे WM_LBUTTONDOWN और WM_LBUTTONUP) मैन्युअल रूप से और माउस इनपुट को अनुकरण करने के लिए उन्हें WPF विंडो में स्पष्ट रूप से भेजें।

दुर्भाग्यवश, यह अपेक्षित काम नहीं करता है (यहां तक ​​कि जब मैं परीक्षण उद्देश्यों के लिए, डब्ल्यूपीएफ विंडो को अग्रभूमि विंडो के रूप में सेट करता हूं)।

मैंने अपने परीक्षण WPF विंडो में एक बटन जोड़ा है जो क्लिक करते समय एक संदेश बॉक्स प्रदर्शित करता है। उचित माउस संदेशों को इंजेक्शन करते समय मैंने बटन पर कर्सर को मैन्युअल रूप से स्थानांतरित किया है, बटन को क्लिक करने का कारण नहीं है, हालांकि (यानी क्लिक किए गए ईवेंट को WPF ढांचे द्वारा नहीं निकाल दिया जाता है)।

मैं (क्लाइंट क्षेत्र) वास्तविक संवाद पर माउस क्लिक के लिए कोई हैंडलर जोड़ते हैं तो वह हैंडलर अगर मैं संवाद खुद पर कर्सर की स्थिति और रूप में एक ही खिड़की संदेशों इंजेक्षन कहा जाता हो करता है से पहले:

this.MouseLeftButtonDown += WndMouseDown; 

public void WndMouseDown(object sender, EventArgs e) 
{ 
    ... 
} 

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

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

(यह उल्लेखनीय है कि यह दृष्टिकोण [विंडो संदेश भेजना] सामान्य Win32 विंडोज़ जैसे स्टार्ट-> रन संवाद पर ठीक काम करता है। यहां अंतर यह है कि डब्ल्यूपीएफ में केवल एक भौतिक Win32 विंडो है और शेष WPF विशिष्ट है , जिसका अर्थ है सभी खिड़की संदेशों कि वास्तविक बटन शीर्ष स्तर के खिड़की के बजाय पर जाएं।)

मैं उच्च और निम्न इस का जवाब के लिए खोज कर रहे हैं और किसी भी विचार या विचारों की सराहना करेंगे।

+0

आपकी आवश्यकता के आधार पर इनपुट अनुकरण करने की कोशिश करने के बजाय UI ऑटोमेशन को देखने लायक हो सकता है। लेकिन यह * के लिए इनपुट * इंजेक्ट करने की कोशिश कर रहा है, इस पर निर्भर करेगा - यह पिक्सेल-स्तर की सामग्री के बजाय नियंत्रण-स्तर की सामग्री हो जाता है ... – itowlson

+0

हां, और यूआई स्वचालन के विभिन्न स्तर हैं: http : //blogs.msdn.com/ivo_manolov/archive/2008/12/15/9223397.aspx मैं पहले से ही इंजेक्षन/इनपुट को स्वचालित करने के TestAPI का उपयोग करते हुए देखा है, लेकिन दुर्भाग्य से वे नहीं बल्कि हुड के नीचे SendInput() का उपयोग सीधे डब्ल्यूपीएफ ढांचे में इनपुट इंजेक्शन से। – dreijer

+0

necroposting के लिए खेद है, लेकिन अब नेट से संदर्भ स्रोत के साथ उपलब्ध है, इस और अधिक गहराई से देखा जा सकता है https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/Primitives/ButtonBase.cs , 414 –

उत्तर

1

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

+0

जैसा कि मैंने अपनी पिछली टिप्पणी में कहा था, यह वास्तव में कई कारणों से काम नहीं करेगा। उदाहरण का प्रयोग करना माउस क्लिक अनुकरण करने के लिए टेस्टएपीआई फ्रेमवर्क हुड के नीचे SendInput() में अनुवाद करता है। की पहचान करने का एक और मार्ग जो को नियंत्रित कर्सर किया जा रहा है और फिर उस नियंत्रण स्पष्ट रूप से अपने स्वयं के पैटर्न पर नियंत्रण की वजह से जो नियंत्रण के लिए अलग-अलग हो समस्याओं, है लागू जा रहे हैं: http://social.msdn.microsoft.com/Forums/en -US/windowsaccessibilityandautomation/धागा/25972b31-ac1a-401e-aab3-b7c8b1b96694 # a776adcb-e6d2-43fa-b78c-da6de7628d4e – dreijer

0

आपकी रणनीति मूल रूप से ध्वनि है लेकिन किसी अन्य प्रक्रिया के स्वामित्व वाली विंडो को संदेश भेजने के लिए आपको पहले संदेश पंजीकृत करना होगा।

Here is an article explaining the whole business। दुर्भाग्यवश वीबी में नमूना कोड है लेकिन मुझे यकीन है कि आपको रोक नहीं पाएगा।

+0

इनपुट के लिए धन्यवाद (यमक :) बहाना। मैं वास्तव में एक ही जीयूआई थ्रेड पर एक ही प्रक्रिया के भीतर संदेशों को इंजेक्ट कर रहा हूं, इसलिए कोई अनुमति समस्या नहीं है। जैसा कि मैंने अपने प्रारंभिक प्रश्न में लिखा था, संदेश कभी-कभी WPF ढांचे द्वारा सही ढंग से संसाधित होते हैं (जैसे संवाद पर क्लिक करते समय)। – dreijer

+0

हाँ मैंने अभी आपके प्रश्न का हिस्सा देखा है जहां आप उल्लेख करते हैं कि आपको कुछ माउस ईवेंट फायरिंग मिल रही हैं, जिसका अर्थ यह है कि यह सभी इंप्रोक है। –

3

मैं अत्यधिक UIAutomation मार्ग से जा रहा सुझाव देना चाहेंगे। आप विंडो हैंडल द्वारा ऑटोमेशन एलीमेंट बनाते हैं। बटन पर क्रॉल करें और इसे आमंत्रित करें। मैं सिर्फ यह जानना चाहता हूं कि आपने कुंजीपटल इनपुट कैसे काम किया है। मैं वर्तमान में बातचीत के मुद्दे को हल करने की कोशिश कर रहा हूं। वर्चुअल कीबोर्ड संदेशों का जवाब देने के लिए, एक WPF विंडो कैसे प्राप्त करें (मैंने Win32 कॉल के माध्यम से इसे HWND प्राप्त करने में कामयाब रहा है)। मैंने विंडो में ++ जासूसी सत्रों को लॉग इन किया है और बिना सफलता के इनपुट को दोहराया है।

+0

इसके साथ समस्या यह है कि मुझे जरूरी नहीं है कि उपयोगकर्ता किस प्रकार (नियंत्रण का प्रकार) पर क्लिक कर रहा है। की तरह, यह बटन हो सकता है, यह एक स्क्रॉलबार हो सकता है, यह वेब ब्राउज़र नियंत्रण हो सकता है। मुझे हर एक प्रकार को लपेटने के बिना इन सभी नियंत्रणों का समर्थन करने का तरीका समझने में कठिनाई हो रही है। कीबोर्ड इनपुट के लिए, सुनिश्चित करें कि आप पोस्ट किए जाने वाले संदेशों को पोस्ट कर रहे हैं (यानी PostMessage() बनाम SendMessage())। आप जीयूआई थ्रेड के संदर्भ में चलते समय भी पोस्टिंग का प्रयास कर सकते हैं। – dreijer

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