2009-08-03 11 views
18

        मैंने पहले से ही एक एप्लिकेशन बनाया है जो कमांड को सक्रिय विंडो में भेजता है। मैं अपनी प्रक्रिया चल रहा है, जबकि मैं कंप्यूटर का उपयोग करने में सक्षम होना चाहता हूं क्योंकि जैसे ही मैं दूसरी विंडो पर फ़ोकस करता हूं, भेजने की कुंजी के माध्यम से भेजे जाने वाले प्रमुख स्ट्रोक विंडो पर जाते हैं जिन्हें मैंने अभी स्विच किया है।मैं Windows API का उपयोग करके इसे सक्रिय किए बिना विंडो में कुंजी स्ट्रोक कैसे भेजूं?

        वर्तमान में मैं विंडोज एपीआई से FindWindow, IsIconic, और ShowWindow का उपयोग करें। मुझे यह देखने के लिए जांचना है कि क्या विंडो FindWindow के साथ है और मेरी ऑब्जेक्ट को उस कॉल के साथ लौटाई गई विशिष्ट विंडो पर सेट करें, फिर मैं जांच करता हूं कि यह IsIconic के साथ छोटा है या अगर यह है, तो ShowWindow को कॉल करें, और फिर अंत में मुझे कॉल करना होगा Interaction.App उस विंडो पर फ़ोकस सेट करने के लिए सक्रिय करें। इससे पहले कि मैं मुख्य स्ट्रोक भी भेजूं, यह सब किया जाता है। ऐसा लगता है कि विंडो दिखाने और इसे सक्रिय किए बिना केवल प्रमुख स्ट्रोक भेजने का कोई तरीका होना चाहिए। बड़ी बात यह है कि मेरा एप्लिकेशन कुंजी स्ट्रोक चला रहा है, मैं अपने कंप्यूटर पर कुछ भी नहीं कर सकता।

+0

आप किस ओएस का उपयोग कर रहे हैं? –

+0

मैं विंडोज विस्टा का उपयोग कर रहा हूं। मैं सी # में विजुअल स्टूडियो 2008 के साथ .NET 3.5 SP1 ढांचे का भी उपयोग कर रहा हूं। – SlipToFall

+0

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

उत्तर

24

ठीक है, यह निश्चित रूप से निराशाजनक है, लेकिन आप मूल रूप से यह 100% विश्वसनीयता के साथ नहीं कर सकते हैं।

विंडोज मानते हैं कि सक्रिय विंडो कुंजीपटल इनपुट प्राप्त करने वाला है। नकली कीबोर्ड इनपुट का उचित तरीका SendInput के साथ है, और आप देखेंगे कि यह केवल सक्रिय विंडो में संदेश भेजता है।

कहा जा रहा है, आप कर सकते हैं SendMessageWM_KEYUP, WM_CHAR, और WM_KEYDOWN संदेश और (WndProc उन्हें प्राप्त करने पर निर्भर करता है) हो सकता है इसके साथ मिलता है। लेकिन याद रखें, इसकी परिस्थितियों, अवधि के तहत going to break

6

लगता है जैसे आप keybd_event() या SendInput() का उपयोग कर रहे हैं, जो दोनों वर्तमान में सक्रिय विंडो में कीस्ट्रोक भेजते हैं। किसी विशिष्ट विंडो पर कीस्ट्रोक को निर्देशित करने के लिए, भले ही वह widnow केंद्रित है या नहीं, आपको पहले अपना एचडब्ल्यूएनडी हैंडल ढूंढना होगा, और उसके बाद उचित रूप से प्रारूपित WM_KEYUP/नीचे और WM_CHAR संदेशों को सीधे पोस्ट करना होगा।

0

आपके पास विंडोज़ HWND होने के बाद, आप सीधे संदेश संदेश (WM_KEYDOWN और WM_KEYUP संदेशों को अपने संदेश कतार में भेज सकते हैं। खिड़की को सक्रिय नहीं होना चाहिए।

हालांकि, यह समझता है कि यह इस बात पर निर्भर करता है कि लक्ष्य एप्लिकेशन कीबोर्ड इनपुट को कैसे संसाधित करता है। इसे संभालने के कई अलग-अलग तरीके हैं।

WM_KEYUP/WM_KEYDOWN सबसे आम है और कुछ एप्लिकेशन केवल एक या दूसरे (आमतौर पर WM_KEYDOWN) को संसाधित करते हैं।

WM_CHAR भी काफी आम

कुछ कार्यक्रमों GetAsyncKeyState, GetKeyState, या GetKeyboardState का उपयोग करें। यह बेहद असामान्य है, लेकिन प्रभावी रूप से SendMessage() के साथ कीप्रेस इंजेक्शन को रोकता है। यदि यह मामला keybd_event() पर वापस आ जाता है जो सीधे कीबोर्ड ड्राइवर द्वारा संभाला जाता है। बेशक खिड़की को सक्रिय होना होगा

संबंधित मुद्दे