我意识到AutoIT有我需要的功能,所以有看了看source文件sendKeys.cpp,发现该功能下面的C++代码片段,这将是很容易转化为C#:
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
扫描代码可以根儿ated与MapVirtualKey
C#翻译:
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);
作为链接后国家,不要使用SendMessage函数发送键击,使用SendInput代替。 http://blogs.msdn.com/b/oldnewthing/archive/2005/05/30/423202.aspx – 2012-04-23 11:56:40
@RussC:谢谢,但它需要与SendMessage完成,因为我想将密钥发送到其他窗口比活动的。真的,我只需要知道如何构建这个lParam。 – Drahcir 2012-04-23 12:13:41
我已在下面更新了我的答案。你能澄清你将发送WM_KEYDOWN消息给SendMessage吗? – 2012-04-23 12:32:38