tôi nhận ra rằng AutoIT có các chức năng mà tôi cần, vì vậy có nhìn source tập tin sendKeys.cpp và tìm thấy C++ đoạn mã sau đây cho chức năng này, nó sẽ dễ dàng đủ để dịch sang 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
mã quét có thể gener ated với MapVirtualKey
C# Dịch:
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);
Khi bài tiểu bang liên kết, không sử dụng SendMessage để gửi tổ hợp phím, sử dụng SendInput để thay thế. http://blogs.msdn.com/b/oldnewthing/archive/2005/05/30/423202.aspx –
@RussC: Cảm ơn, nhưng nó cần phải được thực hiện với SendMessage vì tôi muốn gửi chìa khóa đến cửa sổ khác so với hoạt động. Thực sự tôi chỉ cần biết cách xây dựng lParam này. – Drahcir
Tôi đã cập nhật câu trả lời của mình bên dưới. Bạn có thể làm rõ rằng bạn sẽ gửi tin nhắn WM_KEYDOWN đến SendMessage? –