c# वेबब्रेसर नियंत्रण के साथ एक्सेल कस्टमटाकपैन-कुंजीपटल/फोकस मुद्दे




excel winforms (2)

मुझे इस सटीक मुद्दे https://social.msdn.microsoft.com/Forums/vstudio/en-US/e417e686-032c-4324-b778-fef66c7687cd/excel-customtaskpane-with-webbrowser-control-keyboardfocus-issues कर रहे हैं? मंच = VSTO

इसके अलावा यहां बताया गया है कि https://connect.microsoft.com/visualstudio/feedback/details/521465/the-focus-issue-between-excel-cells-and-excel-customtaskpane-with-webbrowser-control

मैं Visual Studio Professional 2013 का उपयोग करते हुए एक एक्सेल 2010 प्लगिन लिख रहा हूं। मैंने एक सिस्टम के साथ एक सरल कस्टमटाकपैन बना लिया है। Windows.Forms.WebBrowser बच्चे इसे दाखिल करते हैं। प्लगइन ठीक काम करता है और मैं क्लिक करके वेबब्राउज़र के अंदर नेविगेट करने में सक्षम हूं और चेकबॉक्स की स्थिति बदलता हूं।

जब मैं एक इनपुट टेक्स्टबॉक्स पर क्लिक करता हूं, तो मैं फ़ोकस करता हूं और मुझे कर्सर ब्लिंकिंग दिखाई देता है, लेकिन जब मैं पाठ लिखना शुरू करता हूँ तो Excel को भेजा जाता है और ब्राउज़र के अंदर टेक्स्ट बॉक्स के बजाय सेल में लिखा जाता है।

रिबन लोड होने पर कस्टम टास्कपैन जोड़ते हैं I

private void Ribbon_Load(object sender, RibbonUIEventArgs e)
{
  TaskPaneView taskPaneView = new TaskPaneView();
  Microsoft.Office.Tools.CustomTaskPane myTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(taskPaneView, "Title");
  myTaskPane.Visible = true;
}

जब मैं टेक्स्टबॉक्स पर क्लिक करता हूं तो F6 यह सही तरीके से काम करता है। कस्टम टास्कपैन हेडर थोड़ा हल्का हो जाता है और टेक्स्ट टेक्स्ट में कैप्चर किया जाता है।

मैं इस समस्या को ठीक कैसे कर सकता हूं, ताकि जब मैं इनपुट टेक्स्ट बॉक्स पर क्लिक करता हूं तो पाठ एक्सेल के बजाय बॉक्स में जाता है?

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


ठीक है, मैं निम्नलिखित कोड का उपयोग करके इस समस्या को ठीक करने में सक्षम था

protected override void WndProc(ref Message m)
{
  if(m.Msg == 528 && !this.Focused)
  {
    this.Focus();
  }
  base.WndProc(ref m);
}

मैंने इस कार्य को मेरे टास्कपैन्यूव्यू में जोड़ दिया था जो केवल उस वेबब्रोवर बच्चे के साथ एक यूजरट्रांटॉल है। मुझे इस बात की गहरी समझ नहीं है कि यह या क्यों काम करता है, लेकिन मूल रूप से मुझे लगता है कि क्या हो रहा है मैं WndProc को अवरुद्ध कर रहा हूं जो कि कुछ कम-स्तरीय फ़ंक्शन है जो प्रक्रिया संदेशों को विंडो में भेज दिया जाता है। मैं इसे देखने के लिए उपयोग करता हूं कि क्या संदेश 528 है, जो मुझे लगता है कि इसका मतलब है सूचित करें parent। मुझे नहीं पता है कि यह वही संदेश है जो मुझे सुनना चाहिए, लेकिन यह काम करने लगता है।

एक बार मेरे पास सही संदेश संदेश है, तो मैं यह देखने के लिए जांचता हूं कि क्या टास्कपैन्यूव्यू फ़ोकस है और यदि नहीं, तो मैं focus() फ़ंक्शन पर focus() देता हूं। मैंने पहले परीक्षण किया था कि दिखाया गया है कि मैन्युअल रूप से मैंने टास्कपैन्यूव्यू पर focus किया था, सबकुछ ठीक काम किया। इसलिए यदि मुझे फोकस नहीं है, तो मैन्युअल रूप से फ़ोकस का अनुरोध करें और हम सभी अच्छे हैं।

मैं इसकी सराहना करता हूं अगर कोई और अधिक विस्तृत विवरण प्रदान कर सकता है कि यह क्यों काम करता है, तो मैं इसे बेहतर समझ सकता हूं, लेकिन कम से कम मैंने समस्या का हल किया Jeremy Thompson को इस मुद्दे पर एक नए तरीके से सोचने के लिए धन्यवाद।


प्रश्न: यह क्यों काम करता है के रूप में एक अधिक विस्तृत व्याख्या प्रदान करें तो मैं इसे बेहतर समझ सकता हूँ

मैं खुश हूं कि आपका यह चलने लगा! मूल कारण विश्लेषण करने के लिए हमें यह देखना होगा कि 528 संदेश कहाँ भेजा जाता है और हमें ऐसा करने के लिए माइक्रोसॉफ्ट एक्सेल सोर्स कोड की आवश्यकता होगी।

मुझे नहीं लगता कि इसके लायक समय व्यतीत करने में समस्या का समाधान हो रहा है या ऐसा क्यों होता है क्योंकि यह एक बुग है! माइक्रोसॉफ्ट को ठीक करने में मदद करने के लिए एक कनेक्ट बग लॉगिंग करना यह सबसे अच्छी बात है जो आप कर सकते हैं हम इसके आसपास ही काम कर सकते हैं, यह उनके स्रोत कोड में एक समस्या है

यह काफी दुर्लभ है कि आप इन परिदृश्यों को वस्तों को देखने के लिए VSTO में देखते हैं और आपको निश्चित रूप से एक मिल गया है; जहां एक उपयोगकर्ता एडी-इन टेक्स्ट बॉक्स में पाठ इनपुट में प्रवेश करता है और वर्कशीट में एक सेल में संदेश प्रवाह करता है !! मेरी स्थिति में; जहां संदेश Calendars_SelectedChange() चेंज Calendars_SelectedChange() ईवेंट पर पम्प नहीं किया गया था इसलिए हम यहां बनाये गये व्यवहार का एक विषय देख सकते हैं जो हंस अच्छी तरह से बताते हैं (क्यू एंड ए से कथित तौर पर मेरी टिप्पणियों से जुड़ा हुआ) :

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

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

और मेनू के प्राप्त होने वाले ईवेंट के साथ VSTO WPF कनेक्ट मामले को न भूलें संदेशों को पंप करने और मेनू के लिए GotFocusEvent और LostFocusEvent की सदस्यता के लिए DispatcherFrame का उपयोग करने में शामिल समाधान।

इसलिए बग नियंत्रण के साथ करना है जो इनपुट का जवाब देते हैं और void WndProc(ref Message m) संदेशों को प्रेषण पाश में ग़लत फ़िल्टर या पुनर्निर्देशित किया जा रहा है।







vsto