मैं प्रोग्रामेटिक रूप से C # में मुख्य कार्यक्रम कैसे बना सकता हूं?


107

मैं प्रोग्राम को कैसे बना सकता हूं जो कीबोर्ड पर दबाए जाने वाले कुंजी को अनुकरण करेगा?


6
क्या आपको बस आग लगने की घटना की आवश्यकता है?
डैनियल ए। व्हाइट

मुझे लगता है कि 'असली' कुंजीपट को अनुकरण करने के लिए आपको अनवांटेड कोड में कदम रखना होगा।
जोनास बी

हां, मुझे सिर्फ आग लगने की घटना की जरूरत है।
डैन वोगेल

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

6
@ ईडीएस: सवाल इस बिंदु पर सुंदर था। मैं कीपैड बनाने के बारे में बहुत अधिक विवरण जोड़ सकता था, और अभी भी वही जवाब मिला। यह देखते हुए कि मुझे वास्तव में क्या चाहिए, यह मुझे "खराब गुणवत्ता" प्रश्न की तरह नहीं लगता है।
दान वोगेल

जवाबों:


147

प्रश्न को WPF टैग किया गया है लेकिन अब तक के जवाब विशिष्ट WinForms और Win32 हैं।

WPF में ऐसा करने के लिए, बस एक KeyEventArgs का निर्माण करें और लक्ष्य पर RaiseEvent को कॉल करें। उदाहरण के लिए, वर्तमान में फ़ोकस किए गए तत्व के लिए एक KeyDown इवेंट सम्मिलित करें:

  var key = Key.Insert;                    // Key to send
  var target = Keyboard.FocusedElement;    // Target element
  var routedEvent = Keyboard.KeyDownEvent; // Event to send

  target.RaiseEvent(
    new KeyEventArgs(
      Keyboard.PrimaryDevice,
      PresentationSource.FromVisual(target),
      0,
      key)
    { RoutedEvent=routedEvent }
  );

यह समाधान देशी कॉल या विंडोज इंटर्नल पर निर्भर नहीं करता है और दूसरों की तुलना में बहुत अधिक विश्वसनीय होना चाहिए। यह आपको एक विशिष्ट तत्व पर एक कुंजीपट अनुकरण करने की भी अनुमति देता है।

ध्यान दें कि यह कोड केवल PreviewKeyDown, KeyDown, PreviewKeyUp और KeyUp घटनाओं पर लागू है। यदि आप TextInput ईवेंट भेजना चाहते हैं, तो आप इसके बजाय ऐसा करेंगे:

  var text = "Hello";
  var target = Keyboard.FocusedElement;
  var routedEvent = TextCompositionManager.TextInputEvent;

  target.RaiseEvent(
    new TextCompositionEventArgs(
      InputManager.Current.PrimaryKeyboardDevice,
      new TextComposition(InputManager.Current, target, text))
    { RoutedEvent = routedEvent }
  );

यह भी ध्यान दें:

  • नियंत्रण पूर्वावलोकन घटनाओं को प्राप्त करने की उम्मीद करते हैं, उदाहरण के लिए PreviewKeyDown को KeyDown से पहले होना चाहिए

  • Target.RaiseEvent (...) का उपयोग करके मेटा-प्रोसेसिंग के बिना इवेंट को सीधे टारगेट पर भेजता है जैसे एक्सेलेरेटर, टेक्स्ट कंपोजिशन और IME। यह आम तौर पर आप क्या चाहते हैं। दूसरी ओर, यदि आप वास्तव में किसी कारण से वास्तविक कीबोर्ड कुंजियों का अनुकरण करना चाहते हैं, तो आप इसके बजाय InputManager.ProcessInput () का उपयोग करेंगे।


1
मैंने सिर्फ आपके सुझाव की कोशिश की, मुझे कोई असर नहीं दिख रहा है। मैंने फ़ोकस किए गए तत्व के लिए कीडाउन ईवेंट हैंडलर संलग्न किया है। मैंने जो घटना उठाई है, वह राहत मिली है, लेकिन KeyState कोई नहीं है, ScanCode 0 है, और isDown गलत है। मुझे लगता है कि मुझे ये मूल्य मिल रहे हैं क्योंकि यह कीबोर्ड की वास्तविक स्थिति है। वास्तविक कीबोर्ड पर एक कुंजी मारना, KeyState = Down, isDown = true, और ScanCode का एक मूल्य है।
डैन वोगेल

24
जब मैंने कीडाउन के पहले कोड की कोशिश की तो मुझे "लक्ष्य" में त्रुटि मिली, इसे दृश्य में परिवर्तित नहीं किया जा सकता है क्यों?
kartal

3
दान, क्या आप जानते हैं कि एक संशोधक (ctrl / alt / shift) के साथ एक कुंजी दबाने का अनुकरण कैसे करें? आंशिक रूप से मुझे इनपुटबाइंडिंग का अनुकरण करने की आवश्यकता है: m_shell.InputBindings.Add (नया की-बाइंडिंग (m_command, Key.Insert, ModifierKeys.Control | ModifierKeys.Alt));
श्राइक

14
के बारे में लक्ष्य मुद्दा है, मैं इसे बाहर का उपयोग करके काम Keyboard.PrimaryDevice.ActiveSourceदेखने stackoverflow.com/questions/10820990/...
OscarRyz

4
यह उत्तर बहुत अच्छा है, लेकिन इसका उपयोग एक संशोधक के साथ कुंजी भेजने के लिए नहीं किया जा सकता है, जैसा कि @Shrike ने उल्लेख किया है। (जैसे Ctrl+C।)
एवेज़

28

Windows प्रपत्र संदर्भ के बिना महत्वपूर्ण घटनाओं का उत्पादन करने के लिए, हम निम्नलिखित विधि का उपयोग कर सकते हैं,

[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

नमूना कोड नीचे दिया गया है:

const int VK_UP = 0x26; //up key
const int VK_DOWN = 0x28;  //down key
const int VK_LEFT = 0x25;
const int VK_RIGHT = 0x27;
const uint KEYEVENTF_KEYUP = 0x0002;
const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
int press()
{
    //Press the key
    keybd_event((byte)VK_UP, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
    return 0;
}

वर्चुअल कीज़ की सूची यहाँ परिभाषित की गई है

पूरी तस्वीर प्राप्त करने के लिए, कृपया नीचे दिए गए लिंक का उपयोग करें, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html


उपयुक्त, अगर आपकी खिड़की शीर्ष पर होगी। इसने मेरी स्थिति को आंशिक रूप से हल कर दिया, धन्यवाद!
सेर्गेई

राजेश के जवाब के अलावा, अगर आप मोबाइल प्लेटफॉर्म में ऐसा करना चाहते हैं, तो आपको "coredll.ddl" आयात करना होगा
user1123236

22

मैंने इसका उपयोग नहीं किया है, लेकिन SendKeys जो चाहें कर सकते हैं।

सक्रिय एप्लिकेशन को कीस्ट्रोक और कीस्ट्रोक संयोजन भेजने के लिए SendKeys का उपयोग करें। इस वर्ग को तत्काल नहीं किया जा सकता है। कक्षा में कीस्ट्रोक भेजने के लिए और तुरंत अपने कार्यक्रम के प्रवाह के साथ जारी रखें, Send का उपयोग करें। कीस्ट्रोक द्वारा शुरू की गई किसी भी प्रक्रिया के लिए प्रतीक्षा करने के लिए, SendWait का उपयोग करें।

System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");

Microsoft के यहाँ कुछ और उपयोग उदाहरण हैं


3
मैंने SendKeys.Send का उपयोग करने की कोशिश की और मुझे यह InvalidOperationException मिली: "SendKeys इस एप्लिकेशन के अंदर नहीं चल सकता क्योंकि एप्लिकेशन Windows संदेशों को संभाल नहीं रहा है। या तो संदेशों को संभालने के लिए एप्लिकेशन को बदल दें, या SendKeys.endWait विधि का उपयोग करें।" SendKey.SendWait का उपयोग करने का कोई प्रभाव नहीं है।
डैन वोगेल

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

11

सरलता! (क्योंकि किसी और ने पहले से ही हमारे लिए काम किया था ...)

सुझाए गए उत्तरों के साथ इस पर प्रयास करने में बहुत समय बिताने के बाद, मैं इस कोडप्लेक्स प्रोजेक्ट विंडोज इनपुट सिमुलेटर पर आया , जिसने इसे एक साधारण प्रेस का अनुकरण करने के लिए सरल बनाया:

  1. पैकेज स्थापित करें, किया जा सकता है या NuGet पैकेज मैनेजर से या पैकेज मैनेजर कंसोल से जैसे:

    इन्स्टॉल-पैकेज इनपुटसिमुलेटर

  2. कोड की इस 2 पंक्तियों का उपयोग करें:

    inputSimulator = new InputSimulator() inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)

और बस!

------- संपादित करें --------

कोडप्लेक्स पर प्रोजेक्ट पेज को किसी कारण से चिह्नित किया गया है, यह NuGet गैलरी की लिंक है।


यह बहुत अच्छी तरह से काम करता है, हालांकि मैं यह पता लगाने में सक्षम नहीं हूं कि इस काम को कुंजी के संयोजन के साथ कैसे बनाया जाए,
user1234433222

जब आप कहते हैं कि कुंजियों का संयोजन क्या आपका मतलब CTRL-C है?
रवि गोल्डनबर्ग

हाँ या यहां तक ​​कि अगर आप पूरी स्क्रीन पर जाने के लिए कंसोल एप्लिकेशन चाहते हैं, जैसे Alt-Enter, मुझे पता है कि आप F11 का उपयोग पूर्ण स्क्रीन में प्रवेश करने के लिए कर सकते हैं, लेकिन यह देखना अच्छा होगा कि Alt-Enter काम करेगा :)
user1234433222

1
वैसे आप ऐसा कर सकते हैं, हालाँकि मैंने इसे आज़माया नहीं है, बस inputSimulator.Keyboard.odifiedKeyStroke (VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C) का उपयोग करें;
रविडेन गोल्डनबर्ग

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.