c# WinForms इनपुट फोकस पर स्वचालित रूप से टैबलेट टच कीबोर्ड पॉप अप करें




windows delphi (4)

जब मैं एक WinForms (या डेल्फी, अंत में देखें) टैबलेट मोड में विंडोज 10 पर एप्लिकेशन चलाता है, तो एक इनपुट बॉक्स स्वचालित रूप से पॉप नहीं होता है, जब कोई इनपुट बॉक्स केंद्रित होता है।

मेरा मानना ​​है कि यह बिना किसी अतिरिक्त कोड / सेटअप के स्वचालित रूप से होना चाहिए।

एक परीक्षण के लिए, मेरे पास एक TextBox नियंत्रण के साथ सबसे सरल वीएस 2015 WinForms डेस्कटॉप एप्लिकेशन है।

यह विजुअल स्टूडियो द्वारा बनाए गए डिफ़ॉल्ट विंडोज फॉर्म एप्लिकेशन सी # प्रोजेक्ट है। कोई कोड नहीं जोड़ा गया, कोई गुण नहीं बदला। टूलबॉक्स से ड्रॉप करके बस TextBox जोड़ा गया था (फिर से कोई गुण नहीं बदला गया):

this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox1.Location = new System.Drawing.Point(64, 27);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(100, 20);
this.textBox1.TabIndex = 0;

मेरी धारणा को सत्यापित करने के लिए कि पॉप अप स्वचालित होना चाहिए:

  • मैंने विंडोज 10 पर notepad.exe विंडोज एक्सपी संस्करण को चलाने की कोशिश की है। यह स्वचालित रूप से टच कीबोर्ड को पॉप अप करता है। मुझे संदेह है कि विंडोज एक्सपी के पास टच कीबोर्ड के लिए कोई स्पष्ट समर्थन था।

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

  • WxWidgets पर बनाए गए अनुप्रयोगों के लिए वही (उदाहरण के लिए FileZilla 3.x)।

ऐसा लगता है कि WinForms में कुछ टूटा हुआ है जो स्वचालित पॉपअप को रोकता है। दिलचस्प बात यह है कि स्वचालित पॉप अप काम करता है:

  • कॉम्बो बॉक्स (संपादन योग्य) कॉम्बो बॉक्स ( ComboBox DropDownStyle = DropDown साथ DropDownStyle = DropDown )
  • पासवर्ड मोड में टेक्स्ट बॉक्स के लिए ( TextBox.PasswordChar )
  • समृद्ध टेक्स्ट बॉक्स के लिए ( RichTextBox )
  • जब इनपुट बॉक्स इस समय केंद्रित होता है तो हार्डवेयर कीबोर्ड "हटाया जाता है" (मैं लेनोवो योग नोटबुक पर स्क्रीन फ़्लिप करके इसका परीक्षण करता हूं), लेकिन बाद में नहीं।

मैंने TabTip.exe चलाकर एक स्पष्ट पॉपअप के बारे में सभी संकेतों को TabTip.exe । उदाहरण के लिए:

  • सी # WinForms में विंडोज़ स्क्रीन पर कीबोर्ड का उपयोग कैसे करें
  • डेस्कटॉप के नीचे विंडोज 8 टच कीबोर्ड टैबट खोलें और बंद करें
  • मैं सी # विनफॉर्म से ऑन-स्क्रीन कीबोर्ड प्रक्रिया को सही तरीके से कैसे बंद करूं?
  • विंडोज 10 (सतह) पर कीबोर्ड विनफॉर्म

अधिकांश "समाधान" इस तरह के एक कोड की पेशकश करते हैं:

var progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
var keyboardPath = Path.Combine(progFiles, "TabTip.exe");
this.keyboardProc = Process.Start(keyboardPath);

लेकिन मुझे विश्वास नहीं है कि यह "आधिकारिक" तरीका हो सकता है। यदि कुछ और नहीं है, तो TabTip.exe चलाकर खोले गए कीबोर्ड को छिपाने का कोई साफ तरीका नहीं है (समाधान में प्रक्रिया को मारने या TabTip.exe कुंजी भेजने जैसे हैक शामिल हैं)।

और वास्तव में उपरोक्त हैक विंडोज 10 वर्षगांठ अद्यतन में अब और काम नहीं कर रहा है:

  • विंडोज 10 वर्षगांठ संस्करण में टच कीबोर्ड (टैबटीप.एक्सई) दिखाएं

दिलचस्प बात यह है कि मैं डेल्फी / सी ++ बिल्डर / वीसीएल अनुप्रयोगों के साथ एक ही व्यवहार देखता हूं। कीबोर्ड संपादन बॉक्स ( TEdit ) के लिए पॉप अप नहीं करता है। यह कॉम्बो बॉक्स ( TComboBox ) और पासवर्ड मोड में पासवर्ड बॉक्स के लिए पॉप अप करता है ( PasswordChar )। दिलचस्प बात यह नहीं है कि TRichEdit , .NET RichTextBox उल्लेखनीय अंतर क्या है, जो शायद जांच के लायक है।

यह (अनुत्तरित) प्रश्न एक समान व्यवहार का वर्णन करता है:
संपादन बॉक्स में डेल्फी XE8 स्पर्श लिखा गया अनुप्रयोग कीबोर्ड 10 में दिखाई नहीं देता है ।


मूल कारण यह प्रतीत होता है कि Winforms 'टेक्स्टबॉक्स एक ऑटोमेशन एलीमेंट नहीं है, जबकि शेष उल्लिखित नियंत्रण (कॉम्बोबॉक्स आदि) हैं।

मार्कस वॉन अंड ज़ू हेबर के स्वीकृत उत्तर का उद्धरण यहां दिया गया है :

हमने इसे " विंडोज 8+ पर डब्ल्यूपीएफ अनुप्रयोगों में टेक्स्टबॉक्स के लिए स्वचालित टच कीबोर्ड " लेख में पाया, लेकिन यह Winforms के लिए भी बहुत अच्छा (और यहां तक ​​कि आसान!) भी काम करता है। धन्यवाद, दिमित्री Lyalin!

  1. अपनी परियोजना में UIAutomationClient.dll का संदर्भ डालें

  2. एप्लिकेशन की मुख्य विंडो के फॉर्म-लोड-हैंडलर में, निम्न कोड डालें:

    var asForm = System.Windows.Automation.AutomationElement.FromHandle(this.Handle);
    

जैसा कि ओफेक शिलॉन के जवाब से संकेत मिलता है, ऐसा लगता है कि टच कीबोर्ड यूआई स्वचालन का लाभ उठा सकता है।

कोई UIAutomationClient.dll से UI स्वचालन के कार्यान्वयन का उपयोग कर सकता है।

UI अनुप्रयोग को जादुई रूप से किसी अनुप्रयोग में इंजेक्शन के लिए, असेंबली आंतरिक वर्ग UiaCoreApi क्लास UiaCoreApi को ट्रिगर किया जाना चाहिए।

उदाहरण के लिए यह प्रतीत नहीं हो सकता है उदाहरण के लिए नो-ऑप:

AutomationElement.FromHandle(IntPtr)(-1)

एक और तरीका स्वचालन यूआई को स्पष्ट रूप से कार्यान्वित करना है। इसके लिए संबंधित इनपुट नियंत्रण के लिए ITextProvider / IValueProvider इंटरफेस लागू करें।

नियंत्रण में इंटरफेस के कार्यान्वयन को बाध्य करने के लिए, WM_GETOBJECT = RootObjectId साथ WM_GETOBJECT विंडो संदेश को संभाल RootObjectId

कार्यान्वयन के उदाहरण के लिए, देखें

हालांकि दिलचस्प रूप से, नियंत्रण, जिसके लिए टच कीबोर्ड आउट-ऑफ-द-बॉक्स (जैसे कॉम्बो बॉक्स या पासवर्ड एडिट बॉक्स, उत्तर देखें), WM_GETOBJECT / RootObjectId लागू न करें। उनके पीछे एक अलग मशीनरी होनी चाहिए।


जहां तक ​​मैं कह सकता हूं, tabtip.exe या tabtip.exe लॉन्च tabtip.exe काफी काम है, यह काम करने का "मानक" तरीका है। मुझे अब तक कोई "आधिकारिक" समाधान नहीं मिला है।

हालांकि, अगर मैं ऐसा कर रहा था, तो मैं कुंजीपटल को आजमाने और खारिज करने के लिए प्रक्रिया को मार नहीं रहा था या चाबियाँ नहीं भेजूंगा। इसके बजाए, जब आप प्रक्रिया लॉन्च करते हैं तो आप विंडो हैंडल प्राप्त कर सकते हैं, और विंडो को कम करने और टास्कबार से इसे छिपाने के लिए इसका उपयोग कर सकते हैं।

यहां किसी ने इसे बंद करने के लिए विंडो हैंडल प्राप्त कर लिया है, लेकिन यह आपको विचार देता है: WPF से स्क्रीन कीबोर्ड पर विंडोज 8 दिखाएं और छुपाएं

अगर आपको मेरी ज़रूरत है, तो मुझे बताएं और मैं देखूंगा कि मुझे पूरा उदाहरण करने का समय मिल सकता है या नहीं।


मैं इस सड़क को कुछ बार नीचे चला गया हूं और केवल taptip.exe विकल्प को लागू करने में सक्षम taptip.exe । और बदले में प्रक्रिया को मार कर खिड़की को बंद करें। मुझे यह भी पता चला कि कुछ रजिस्ट्री हैक्स के साथ आप हस्तलेखन पैनल में डिफ़ॉल्ट रूप से कुंजीपटल प्राप्त कर सकते हैं यदि आप चुनते हैं। लेकिन फिर वह केवल Win8 में काम करता है और Win10 में विफल रहता है। अगर किसी और को यह उपयोगी लगता है तो मैंने यहां किया है:

RegistryKey registryKey = Registry.CurrentUser.CreateSubKey("Software\\Microsoft\\TabletTip\\1.7");

registryKey?.SetValue("KeyboardLayoutPreference", 0, RegistryValueKind.DWord);
registryKey?.SetValue("LastUsedModalityWasHandwriting", 1, RegistryValueKind.DWord);

Process.Start(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe");

मुझे रजिस्ट्री विचार के लिए इस पोस्ट को क्रेडिट देना होगा: विंडोज 8 डेस्कटॉप ऐप: द्वितीयक कीबोर्ड पर टैबटिप.एक्सई खोलें (संख्यात्मक टेक्स्टबॉक्स के लिए)