मैं कस्टम गेम नियंत्रक एप्लिकेशन के लिए कीबोर्ड कमांड अनुकरण करने की कोशिश कर रहा हूं। क्योंकि मुझे डायरेक्ट इनपुट वातावरण में कमांड अनुकरण करने की आवश्यकता होगी क्योंकि अधिकांश सामान्य तरीके काम नहीं करते हैं। मुझे पता है कि एक हुक का उपयोग 100% काम करेगा लेकिन मैं एक आसान कार्यान्वयन खोजने की कोशिश कर रहा हूं।DirectInput अनुप्रयोगों में SendInput API के साथ कीबोर्ड सिम्युलेटिंग
मैंने काफी कुछ खोज किया है और पाया है कि वर्चुअल कुंजियों के बजाय स्कैनकोड के साथ SendInput API का उपयोग करके काम करना चाहिए, लेकिन ऐसा लगता है कि कुंजी "चिपकने" की तरह व्यवहार करती है। मैंने दोनों कुंजीपटल और KEYUP ईवेंट भेजे हैं, लेकिन जब मैं डायरेक्टइनपूट वातावरण में संदेश भेजने का प्रयास करता हूं, तो गेम कार्य करता है जैसे कि कुंजी दबाई जा रही है।
उदाहरण के लिए, यदि मैं एक "डब्ल्यू" कुंजीपटल अनुकरण करता हूं और उस कुंजी को पहले व्यक्ति शूटर में "आगे बढ़ने" क्रिया में मैप किया जाता है, एक बार जब मैं गेम में हूं, तो नीचे दिया गया कार्य चरित्र को आगे बढ़ने का कारण बनता है । हालांकि, केवल एक बार आदेश जारी करके, यह चरित्र को अनिश्चित काल तक आगे बढ़ाएगा।
यहाँ SendInput समारोह मैं फोन कर रहा हूँ के लिए एक कोड का टुकड़ा (सी # में) है: अगर इस विधि को खोए हुए कारण है, या
[DllImport("user32.dll")]
static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);
public static void Test_KeyDown()
{
INPUT[] InputData = new INPUT[2];
Key ScanCode = Microsoft.DirectX.DirectInput.Key.W;
InputData[0].type = 1; //INPUT_KEYBOARD
InputData[0].wScan = (ushort)ScanCode;
InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE;
InputData[1].type = 1; //INPUT_KEYBOARD
InputData[1].wScan = (ushort)ScanCode;
InputData[1].dwFlags = (uint)(SendInputFlags.KEYEVENTF_KEYUP | SendInputFlags.KEYEVENTF_UNICODE);
// send keydown
if (SendInput(2, InputData, Marshal.SizeOf(InputData[1])) == 0)
{
System.Diagnostics.Debug.WriteLine("SendInput failed with code: " +
Marshal.GetLastWin32Error().ToString());
}
}
मुझे यकीन है कि नहीं कर रहा हूँ अगर वहाँ बस कुछ मूर्खतापूर्ण मैं है मैं याद कर रहा हूँ मुझे अपने कोड को जटिल करने से नफरत है अगर मुझे हुक का उपयोग करके नहीं करना है, लेकिन यह मेरे लिए भी नया क्षेत्र है।
कोई भी मदद जो कोई भी दे सकता है उसकी बहुत सराहना की जाती है।
धन्यवाद!
'INPUT []' क्या है? क्या यह 'user32.dll" से आया था? –