2009-09-09 3 views
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; 
} 
+0

dwFlags + = KEYEVENTF_EXTENDEDKEY에 대한 확신이 있습니까? 당신이 아마 '='또는 '| ='을 의미하는 것 같아요. 또한 KEYDOWN case의 if 문은 의미가 없습니다. 다음 문은 dwFlags 값을 즉시 0을 덮어 쓰므로 의미가 없습니다. – JeffH

+1

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로 설정한다. 이제 잘라 붙여 넣을 수 있습니다. 모든 좋은! 감사 –

답변

1

키보드 재생 내 작업 솔루션입니다 :

case KeyBoardHook.WM_KEYUP: 
    tssKeyPress.Text = hec.KeyCode.ToString() + " Up"; 
    k.mkhi.mi.dwExtraInfo = hec.ExtraInfo; 
    k.mkhi.ki.dwFlags = KEYEVENTF_KEYUP; 
    SetExtendedFlag(hec.KeyCode, ref k); 
    k.mkhi.ki.wScan = 0; 
    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.mi.dwExtraInfo = hec.ExtraInfo; 
    k.mkhi.ki.time = 0; 
    k.mkhi.ki.dwFlags = 0; 
    SetExtendedFlag(hec.KeyCode, ref k); 
    k.mkhi.ki.wScan = 0; 
    SendInput(1, ref k, Marshal.SizeOf(k)); 
    break; 

private void SetExtendedFlag(Keys keys, ref INPUT k) 
{ 
    k.mkhi.ki.wVk = (ushort)keys; 
    if (((int)keys == (int)VK.VK_LSHIFT && (int)keys == (int)VK.VK_RSHIFT)) 
    { 
     k.mkhi.ki.wVk = (ushort)VK.VK_SHIFT; 
    } 
    if (((int)keys == (int)VK.VK_LCONTROL && (int)keys == (int)VK.VK_RCONTROL)) 
    { 
     k.mkhi.ki.wVk = (ushort)VK.VK_CONTROL; 
    } 
    if (((int)keys == (int)VK.VK_LMENU && (int)keys == (int)VK.VK_RMENU)) 
    { 
     k.mkhi.ki.wVk = (ushort)VK.VK_MENU; 
    } 
    switch ((int)keys) 
    { 
     case((int) VK.VK_RMENU): 
     case ((int)VK.VK_RCONTROL):     
     case ((int)VK.VK_INSERT): 
     case ((int)VK.VK_DELETE): 
     case ((int)VK.VK_LEFT): 
     case ((int)VK.VK_HOME): 
     case ((int)VK.VK_END): 
     case ((int)VK.VK_UP): 
     case ((int)VK.VK_DOWN): 
     case ((int)VK.VK_PRIOR): 
     case ((int)VK.VK_NEXT): 
     case ((int)VK.VK_RIGHT): 
     case ((int)VK.VK_LWIN): 
     case ((int)VK.VK_RWIN): 
     case ((int)VK.VK_APPS): 
     case ((int)VK.VK_SLEEP): 
      k.mkhi.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY; 
      break; 
    } 
} 

을 나는 이제 성공적으로 재생 복사, CTRL-INSERT 및 SHIFT-INSERT를 사용하여 잘라내 기와 과거.

관련 문제