WinAPI

2012-10-18 12 views
5

का उपयोग करके डेल्फी में कीबोर्ड इनपुट को सिम्युलेट करना मुझे डेल्फी ग्रिड (अन्य एप्लिकेशन में) के एक सेल में प्रोग्रामेटिक रूप से एक वर्ण दर्ज करना होगा।WinAPI

आदेश में इस मैन्युअल रूप से करने के लिए, निम्न चरणों के लिए आवश्यक हैं:

  1. प्रेस F3 बटन।
  2. दायां तीर कुंजी 3 बार दबाएं।
  3. स्पेस बटन दबाएं।
  4. कुंजीपटल पर 'अक्षर' टाइप करें।
  5. राइट-तीर कुंजी दबाएं।

    // Press F3 button   
    keybd_event(VK_F3, 0, 0, 0);   
    // Press right arrow key 3 times 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    
    // Press the space button 
    keybd_event(VK_SPACE, 0, 0, 0); 
    
    // Type letter E 
    keybd_event(Ord('E'), 0, 0, 0); 
    
    // Move to the right 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    

लेकिन यह काम नहीं करता। जब मैं यह कोड चलाता हूं, ऐसा कुछ नहीं होता है।

मुझे इस कोड को कैसे संशोधित करना चाहिए ताकि यह वास्तव में उपयोगकर्ता इनपुट को अनुकरण कर सके?

+0

मैंने कुछ समय पहले ['वर्चुअल कीबोर्ड'] (http://stackoverflow.com/a/12565963/960757) के बारे में कुछ किया है (और कई अन्य होंगे)। लेकिन आपकी समस्या के लिए, यदि आप 'TStringGrid' को लक्षित कर रहे हैं, तो मुझे लगता है कि आप इसे ध्यान केंद्रित करने और अपने कीस्ट्रोक अनुकरण करने के अलावा कुछ भी नहीं कर सकते हैं (अगर मुझे यह सही याद है, तो TStringGrid' किसी भी प्रकार के संदेश का जवाब नहीं देता है एक सेल के पाठ को सेट करने में सक्षम हो)। – TLama

+0

इस विशेष एप्लिकेशन में केवल कीबोर्ड के माध्यम से उस ग्रिड में मान दर्ज करना संभव है। मैंने इसे पहले ही ऑटोहॉटकी और एमएस यूआई ऑटोमेशन के साथ किया है, लेकिन अब डेल्फी में इस कोड को फिर से लिखना होगा। –

+0

मैं ग्रिड पर ध्यान केंद्रित नहीं कर सकता क्योंकि लक्ष्य प्रणाली पर एक कार्यक्रम है, जो हर 200 मिलीसेकंड को सक्रिय करता है। –

उत्तर

9

प्रत्येक कुंजी प्रेस एक कुंजी नीचे और फिर एक कुंजी है। तो आपको प्रति कुंजी प्रेस keybd_event पर दो कॉल की आवश्यकता है। उदाहरण के लिए, F3 दबाएँ:

keybd_event(VK_F3, 0, KEYEVENTF_KEYDOWN, 0); 
keybd_event(VK_F3, 0, KEYEVENTF_KEYUP, 0); 

ध्यान दें कि KEYEVENTF_KEYDOWN वास्तव में विंडोज हेडर फाइलें, या डेल्फी अनुवाद द्वारा परिभाषित नहीं है। इसे 0 होने के लिए परिभाषित करें। यह स्पष्ट रूप से कोड स्पष्ट रूप से लिखा गया है।

स्वाभाविक रूप से आप keybd_event पर जोड़े गए कॉल के साथ अपना कोड कूड़े नहींंगे। लेकिन इसके बजाय आप युग्मित कॉल को एक सहायक समारोह में लपेटेंगे।

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

+0

धन्यवाद। क्या 'keybd_event' काम करता है, जब प्रश्न में नियंत्रण केंद्रित नहीं है? –

+0

@DmitriPisarenko नहीं यह नहीं करता है। इनपुट संदेश इनपुट फोकस के साथ नियंत्रण में जाते हैं। –

+0

क्या ग्रिड में विंडोज संदेश भेजने के साथ 'keybd_event' कॉल को प्रतिस्थापित करना संभव है? –

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