0
오류 재현을 시도 할 때 세션 상호 작용을 기록하는 유효성 검사 엔지니어를위한 도구를 작성합니다. 그것은 바탕 화면의 비디오를 생성하고, OS와의 상호 작용을 기록하기 위해 C#에서 키보드와 마우스를 연결합니다. 이벤트는 나중에 읽을 파일로 직렬화됩니다. SendInput을 사용하여 마우스 및 키보드 이벤트를 재생합니다.C# 일부 키보드 이벤트가 제대로 재생되지 않는 경우
잘라 내기 및 붙여 넣기 상호 작용을 재생하는 것 외에는 모든 것이 훌륭하게 작동합니다. CTRL- 삽입 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;
}
dwFlags + = KEYEVENTF_EXTENDEDKEY에 대한 확신이 있습니까? 당신이 아마 '='또는 '| ='을 의미하는 것 같아요. 또한 KEYDOWN case의 if 문은 의미가 없습니다. 다음 문은 dwFlags 값을 즉시 0을 덮어 쓰므로 의미가 없습니다. – JeffH
DOH! 두 경우 모두 맞습니다. 나는 그것을 고쳤지 만 여전히 주사위는 없다. 그러나 나는 그것을 해결했다. 이 기사에 나온 정보를 기반으로 KEYEVENTF_EXTENDEDKEY에 함수를 추가했습니다. http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx 변환 할 코드도 수정했습니다. VK_LSHIFT 및 VK_RSHIFT를 VK_SHIFT로, VK_LCONTROL 및 VK_RCONTROL을 VK_CONTROL로, VK_LMENU 및 VK_RMENU를 VK_MENU로 설정한다. 이제 잘라 붙여 넣을 수 있습니다. 모든 좋은! 감사 –