2012-04-23 6 views
5

मैं एक कीस्ट्रोक भेजने के लिए SendMessage का उपयोग करने की कोशिश कर रहा हूं, और वास्तव में एलपीएआर को समझ नहीं पा रहा हूं। मैं समझता हूं कि विभिन्न बिट्स प्रत्येक पैरामीटर का प्रतिनिधित्व करते हैं और उन्हें क्रम में व्यवस्थित करने की आवश्यकता होती है।SendMessage के LParam को कैसे बनाएँ WM_KEYDOWN

मैं this question & this पढ़ा है, इसलिए मैं जानता हूँ कि जो आदेश बिट्स में होने की जरूरत है, मैं सिर्फ यह कैसे करना है पता नहीं है ...

मैं निम्नलिखित lParam कैसे बना सकता है?

repeat cound = 0, 
scan code = {Don't know what this is?}, 
extended key = 1, 
reserved = 0, 
context code = 0, 
previous key state = 1, 
transition state = 0 
+0

जुड़ा हुआ पोस्ट राज्यों के रूप में, कीस्ट्रोक्स भेजने के लिए SendMessage का उपयोग नहीं करते हैं, बजाय SendInput का उपयोग करें। http://blogs.msdn.com/b/oldnewthing/archive/2005/05/30/423202.aspx –

+1

@RussC: धन्यवाद, लेकिन इसे SendMessage के साथ किया जाना चाहिए क्योंकि मैं एक विंडो को कुंजी भेजना चाहता हूं सक्रिय एक से। वास्तव में मुझे यह जानने की जरूरत है कि इस एलपीएआर को कैसे बनाया जाए। – Drahcir

+0

मैंने नीचे अपना जवाब अपडेट कर दिया है। क्या आप स्पष्टीकरण दे सकते हैं कि आप SendMessage पर WM_KEYDOWN संदेश भेज रहे हैं? –

उत्तर

8

मुझे एहसास हुआ AutoIT कार्यक्षमता है कि मैं जरूरत है, इसलिए है source फ़ाइल sendKeys.cpp को देखा और इस कार्य के लिए निम्नलिखित सी ++ कोड स्निपेट मिला है, यह काफी आसान सी # में अनुवाद करने के लिए किया जाएगा:

scan = MapVirtualKey(vk, 0); 

// Build the generic lparam to be used for WM_KEYDOWN/WM_KEYUP/WM_CHAR 
lparam = 0x00000001 | (LPARAM)(scan << 16);   // Scan code, repeat=1 
if (bForceExtended == true || IsVKExtended(vk) == true) 
    lparam = lparam | 0x01000000;  // Extended code if required 

if ((m_nKeyMod & ALTMOD) && !(m_nKeyMod & CTRLMOD)) // Alt without Ctrl 
    PostMessage(m_hWnd, WM_SYSKEYDOWN, vk, lparam | 0x20000000); // Key down, AltDown=1 
else 
    PostMessage(m_hWnd, WM_KEYDOWN, vk, lparam); // Key down 

स्कैन कोड gener हो सकता है साथ MapVirtualKey

सी # अनुवाद पैदा:

public static void sendKey(IntPtr hwnd, VKeys keyCode, bool extended) 
{ 
    uint scanCode = MapVirtualKey((uint)keyCode, 0); 
    uint lParam; 

    //KEY DOWN 
    lParam = (0x00000001 | (scanCode << 16)); 
    if (extended) 
    { 
     lParam |= 0x01000000; 
    } 
    PostMessage(hwnd, (UInt32)WMessages.WM_KEYDOWN, (IntPtr)keyCode, (IntPtr)lParam); 

    //KEY UP 
    lParam |= 0xC0000000; // set previous key and transition states (bits 30 and 31) 
    PostMessage(hwnd, WMessages.WM_KEYUP, (uint)keyCode, lParam); 
} 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
private static extern uint MapVirtualKey(uint uCode, uint uMapType); 
1

आप पूरी तरह SendMessage उपयोग करने के लिए है, तो आप सही स्थान पर अपने पूर्णांक के टुकड़े टॉगल करने के लिए की जरूरत है। कैसे सी # में यह करने के लिए

इस साइट में दस्तावेज:

http://codeidol.com/csharp/csharpckbk2/Classes-and-Structures/Turning-Bits-On-or-Off/

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

को रिहा करने के लिए कोड के लिए अलग है

विकिपीडिया उन पर एक लेख है:

http://en.wikipedia.org/wiki/Scancode

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