मैं प्रोग्राम को कैसे बना सकता हूं जो कीबोर्ड पर दबाए जाने वाले कुंजी को अनुकरण करेगा?
मैं प्रोग्राम को कैसे बना सकता हूं जो कीबोर्ड पर दबाए जाने वाले कुंजी को अनुकरण करेगा?
जवाबों:
प्रश्न को 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 () का उपयोग करेंगे।
Keyboard.PrimaryDevice.ActiveSource
देखने stackoverflow.com/questions/10820990/...
Ctrl+C
।)
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
मैंने इसका उपयोग नहीं किया है, लेकिन SendKeys जो चाहें कर सकते हैं।
सक्रिय एप्लिकेशन को कीस्ट्रोक और कीस्ट्रोक संयोजन भेजने के लिए SendKeys का उपयोग करें। इस वर्ग को तत्काल नहीं किया जा सकता है। कक्षा में कीस्ट्रोक भेजने के लिए और तुरंत अपने कार्यक्रम के प्रवाह के साथ जारी रखें, Send का उपयोग करें। कीस्ट्रोक द्वारा शुरू की गई किसी भी प्रक्रिया के लिए प्रतीक्षा करने के लिए, SendWait का उपयोग करें।
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
सरलता! (क्योंकि किसी और ने पहले से ही हमारे लिए काम किया था ...)
सुझाए गए उत्तरों के साथ इस पर प्रयास करने में बहुत समय बिताने के बाद, मैं इस कोडप्लेक्स प्रोजेक्ट विंडोज इनपुट सिमुलेटर पर आया , जिसने इसे एक साधारण प्रेस का अनुकरण करने के लिए सरल बनाया:
पैकेज स्थापित करें, किया जा सकता है या NuGet पैकेज मैनेजर से या पैकेज मैनेजर कंसोल से जैसे:
इन्स्टॉल-पैकेज इनपुटसिमुलेटर
कोड की इस 2 पंक्तियों का उपयोग करें:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
और बस!
------- संपादित करें --------
कोडप्लेक्स पर प्रोजेक्ट पेज को किसी कारण से चिह्नित किया गया है, यह NuGet गैलरी की लिंक है।
WM_KEYDOWN भेजने के साथ Windows SendMessage API ।