Я пишу инструмент для инженеров по валидации для регистрации взаимодействия сеанса при попытке воспроизвести сбой. Он создает видео рабочего стола, и я подключаю клавиатуру и мышь в C #, чтобы записать их взаимодействие с ОС.
События сериализуются в файл для последующего чтения.
Я использую SendInput для воспроизведения событий мыши и клавиатуры.
Все отлично работает, кроме воспроизведения взаимодействий вырезания и вставки.
CTRL-Insert
SHIFT-Insert
Кто-нибудь знает, что я делаю не так?
Код моего хука:
// if it's a keyboard event
{
Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(keyData);
MyKeyEventArgs akea = new MyKeyEventArgs();
akea.ExtraInfo = GetMessageExtraInfo();
akea.Code = wParam;
akea.KeyArgs = e;
KeyDown(this, akea); // call to my event handler
}
Мой код SendInput
// if it's a keyboard event
{
case KeyBoardHook.WM_KEYUP:
tssKeyPress.Text = hec.KeyCode.ToString() + " Up";
mi.mkhi.mi.dwExtraInfo = hec.ExtraInfo;
k.mkhi.ki.dwFlags = KEYEVENTF_KEYUP;
if (
((int)hec.KeyCode >= (int)VK.VK_PRIOR && (int)hec.KeyCode <= (int)VK.VK_DELETE) ||
((int)hec.KeyCode >= (int)VK.VK_LWIN && (int)hec.KeyCode <= (int)VK.VK_APPS) ||
((int)hec.KeyCode >= (int)VK.VK_SPACE && (int)hec.KeyCode <= (int)VK.VK_HELP) ||
((int)hec.KeyCode >= (int)VK.VK_SHIFT && (int)hec.KeyCode <= (int)VK.VK_MENU)
)
{
k.mkhi.ki.dwFlags += KEYEVENTF_EXTENDEDKEY;
}
k.mkhi.ki.wVk = (ushort)hec.KeyCode;
k.mkhi.ki.wScan = 0;
//k.mkhi.mi.wScan = (short)hec.KeyData;
k.mkhi.mi.time = 0;
SendInput(1, ref k, Marshal.SizeOf(k));
break;
case KeyBoardHook.WM_KEYDOWN:
tssKeyPress.Text = hec.KeyCode.ToString() + " Down";
k.mkhi.ki.time = 0;
k.mkhi.ki.dwExtraInfo = IntPtr.Zero;
if (
((int)hec.KeyCode >= (int)VK.VK_PRIOR && (int)hec.KeyCode <= (int)VK.VK_DELETE ) ||
((int)hec.KeyCode >= (int)VK.VK_LWIN && (int)hec.KeyCode <= (int)VK.VK_APPS) ||
((int)hec.KeyCode >= (int)VK.VK_SPACE && (int)hec.KeyCode <= (int)VK.VK_HELP) ||
((int)hec.KeyCode >= (int)VK.VK_SHIFT && (int)hec.KeyCode <= (int)VK.VK_MENU)
)
{
k.mkhi.ki.dwFlags += KEYEVENTF_EXTENDEDKEY;
}
k.mkhi.ki.dwFlags = 0;
k.mkhi.ki.wVk = (ushort)hec.KeyCode;
k.mkhi.ki.wScan = 0;
//k.mkhi.mi.wScan = (short)hec.KeyData;
SendInput(1, ref k, Marshal.SizeOf(k));
break;
}