मैं एक 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 विशिष्ट है , जिसका अर्थ है सभी खिड़की संदेशों कि वास्तविक बटन शीर्ष स्तर के खिड़की के बजाय पर जाएं।)
मैं उच्च और निम्न इस का जवाब के लिए खोज कर रहे हैं और किसी भी विचार या विचारों की सराहना करेंगे।
आपकी आवश्यकता के आधार पर इनपुट अनुकरण करने की कोशिश करने के बजाय UI ऑटोमेशन को देखने लायक हो सकता है। लेकिन यह * के लिए इनपुट * इंजेक्ट करने की कोशिश कर रहा है, इस पर निर्भर करेगा - यह पिक्सेल-स्तर की सामग्री के बजाय नियंत्रण-स्तर की सामग्री हो जाता है ... – itowlson
हां, और यूआई स्वचालन के विभिन्न स्तर हैं: http : //blogs.msdn.com/ivo_manolov/archive/2008/12/15/9223397.aspx मैं पहले से ही इंजेक्षन/इनपुट को स्वचालित करने के TestAPI का उपयोग करते हुए देखा है, लेकिन दुर्भाग्य से वे नहीं बल्कि हुड के नीचे SendInput() का उपयोग सीधे डब्ल्यूपीएफ ढांचे में इनपुट इंजेक्शन से। – dreijer
necroposting के लिए खेद है, लेकिन अब नेट से संदर्भ स्रोत के साथ उपलब्ध है, इस और अधिक गहराई से देखा जा सकता है https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Controls/Primitives/ButtonBase.cs , 414 –