2011-11-01 14 views
5

मैं काम के लिए एक स्वचालन कार्यक्रम में SendKeys का उपयोग कर रहा हूँ। मैं साथ चल रहा हूं, और अब मैंने बनाई गई सभी बगों को लोहे से बाहर करने की कोशिश कर रहा हूं :-)प्रोग्रामेटिक रूप से अक्षम कैप्स लॉक

इनमें से एक यह है कि जब मैंने SendKeys.Send ("test") का उपयोग किया, तो कैप्स लॉक चालू है, यह "टेस्ट" के विरोध में "परीक्षण" का उत्पादन करेगा।

bool tmp = Control.IsKeyLocked(Keys.CapsLock); 
if (tmp) 
{ 
    keybd_event(0x14, 0x45, KEYEVENTF_EXTENTEDKEY, (UIntPtr)0); 
    keybd_event(0x14, 0x45, KEYEVENTF_EXTENTEDKEY | KEYEVENTF_KEYUP, (UIntPtr)0); 
    //Application.DoEvents(); <-Testing. 
} 

और फिर तुरंत SendKeys का उपयोग कुछ पाठ भेजने के लिए:

मैं capslock राज्य पता लगाने का प्रयास है, और यह टॉगल यदि आवश्यक हो तो निम्न कोड का उपयोग किया है

SendKeys.SendWait("This Is An Over Capitalized Test String"); 

कौन सा अभी भी इस तरह से बाहर आता है: "टीएचआईएस आईएस एएन कैप्टीलाइज्ड टेस्ट स्टरिंग"।

क्या इस समस्या को हल करने का कोई तरीका है?

उत्तर दिया गया! बस किसी और के लिए स्पष्ट करने के लिए, समस्या

SendKeys.SendWait("{CAPSLOCK}" + text); 

का उपयोग करके हल किया गया था मैं पहली बार प्रयोग करने का प्रयास:

SendKeys.SendWait("{CAPSLOCK}"); 
SendKeys.SendWait("This Is An Over Capitalized Test String"); 

कौन सा बिल्कुल काम नहीं किया।

+1

यदि आप 'SendKeys.Send "{CAPSLOCK} टेस्ट" करते हैं तो क्या होगा? – V4Vendetta

उत्तर

9

यह आपके लिए काम करता है?

if(Control.IsKeyLocked(Keys.CapsLock)) 
     SendKeys.SendWait("{CAPSLOCK}This Is An Over Capitalized Test String"); 
    else 
     SendKeys.SendWait("This Is An Over Capitalized Test String"); 
+0

मैंने अभी इसका परीक्षण किया है, और यह कैप्सलॉक कुंजी की स्थिति को बिल्कुल भी नहीं बदलता है। दूसरी विधि के साथ, यह सीएपीएस एलईडी बंद कर देगा, हालांकि यह भी इसका उत्पादन नहीं करता है। – HeWhoWas

+0

मुझे उस कथन को दोबारा करने दें। जैसे ही आपने लिखा था, कोड का उपयोग करके समस्या हल हो गई। मैं SendKeys.SendWait ("{CAPSLOCK}") को कॉल कर रहा था; और फिर दूसरी पंक्ति पर स्ट्रिंग भेजना। कुंजी आपके द्वारा भेजे जा रहे शेष पाठ के रूप में उसी SendKeys कथन में कैप्लॉक टॉगल करने में है। धन्यवाद! – HeWhoWas

+0

कारण यह है कि सेंडकी में एक कैप्स्लक एक अतिरिक्त कैप्स्लॉक भेजने के बाद पहली प्रेषक पूरा हो जाता है। क्या होता है यह देखने के लिए कुछ डीबग लिखते हैं। – Martin

0

मेरे पास एक एप्लिकेशन है, जहां मुझे अक्सर बाएं-शिफ्ट और टैब के बीच स्विच करने की आवश्यकता होती है। मेरे कीबोर्ड पर CAPSLOCK उन 2 कुंजियों के बीच है और अब मैं गलती करता हूं और फिर, टैब के बजाय एक कैप्सल टाइप कर रहा हूं। मेरा समाधान कैप्सल को रिवर्स करना है और इसके बजाए एक टैब सबमिट करना है। मेरे आश्चर्य के लिए कार्यक्रम स्टैक ओवरफ्लो तक लूप करता है। मुझे पता चला कि कैप्सल-की दो बार भेज दिया गया है। यह मेरा अंतिम समाधान है:

Dim CapsLockProg As Integer = 0 ' after Send Capslock arrives 2 times!!!!! 
Private Sub Description_KeyDown(sender As Object, e As KeyEventArgs) Handles Description.KeyDown 
    If e.KeyCode = Keys.Capital Then 
     If CapsLockProg < 2 Then 
      CapsLockProg += 1 
      If CapsLockProg = 1 Then 
       Windows.Forms.SendKeys.SendWait("{TAB}{CAPSLOCK}") 
      'Else 
      ' ignore 2nd Capslock 
      End If 
     Else 
      CapsLockProg = 0 
     End If 
    End If 
    If e.KeyCode = Keys.Tab Then 
    rest of code 
संबंधित मुद्दे