Я использую этот код в C ++ для отправки ключевых событий в различные приложения.
struct extraKeyInfo
{
unsigned short repeatCount;
unsigned char scanCode;
bool extendedKey, prevKeyState, transitionState;
operator unsigned int()
{
return repeatCount | (scanCode << 16) | (extendedKey << 24) |
(prevKeyState << 30) | (transitionState << 31);
}
};
void SendK(HWND wnd, Char ch, DWORD del)
{
short vkCode = LOBYTE(VkKeyScan(ch));
extraKeyInfo lParam = {};
lParam.scanCode = MapVirtualKey(vkCode, MAPVK_VK_TO_VSC);
PostMessage(wnd, WM_KEYDOWN, vkCode, lParam);
lParam.repeatCount = 1;
lParam.prevKeyState = true;
lParam.transitionState = true;
Sleep(del);
PostMessage(wnd, WM_KEYUP, vkCode, lParam);
}
Мне действительно нужно использовать этот метод в C #. Я знаю, что могу импортировать функции PostMessage и MapVirtualKey из user32.dll, как это
[DllImport("user32.dll")]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
[DllImport("user32.dll")]
public static extern uint MapVirtualKey(uint uCode, uint uMapType);
Но я застрял с переменной lParam. Я не знаю, как преобразовать эти биты флагов в C #. Должен быть способ.
Редактировать. Сделано и сделано
После небольшого совета Jashaszun.
[DllImport("user32.dll")]
public static extern bool PostMessage(IntPtr hWnd, uint Msg, uint wParam, int lParam);
[DllImport("user32.dll")]
public static extern uint MapVirtualKey(uint uCode, uint uMapType);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern short VkKeyScan(char ch);
const uint WM_KEYDOWN = 0x0100;
const uint WM_KEYUP = 0x0101;
const uint MAPVK_VK_TO_VSC = 0x00;
const uint MAPVK_VSC_TO_VK = 0x01;
const uint MAPVK_VK_TO_CHAR = 0x02;
const uint MAPVK_VSC_TO_VK_EX = 0x03;
const uint MAPVK_VK_TO_VSC_EX = 0x04;
class extraKeyInfo
{
public ushort repeatCount;
public char scanCode;
public ushort extendedKey, prevKeyState, transitionState;
public int getint()
{
return repeatCount | (scanCode << 16) | (extendedKey << 24) |
(prevKeyState << 30) | (transitionState << 31);
}
};
public static void SendK(IntPtr wnd, Char ch, Int32 del)
{
uint vkCode = (byte)(VkKeyScan(ch));
extraKeyInfo lParam = new extraKeyInfo();
lParam.scanCode = (char)MapVirtualKey(vkCode, MAPVK_VK_TO_VSC);
PostMessage(wnd, WM_KEYDOWN, vkCode, lParam.getint());
lParam.repeatCount = 1;
lParam.prevKeyState = 1;
lParam.transitionState = 1;
System.Threading.Thread.Sleep(del);
PostMessage(wnd, WM_KEYUP, vkCode, lParam.getint());
}
Функция SendK отправит указанный символ в указанное окно с указанной задержкой удержания.
Задача ещё не решена.