2017-02-27 11 views
0

this 대답으로 제시된대로 키보드 후크를 구현했습니다. 한 가지 경우를 제외하고는 모두 잘 작동합니다. 나는 몇 시간 동안 누르면 키를 길게하려면, 따라서 기술적으로 내가 전화 한 방법에서 remaning,이 일이 일어날 :키보드 후크 저장 키

  1. 내가 (선한)
  2. 응용 프로그램 기록 방법에 남아 그 키는 독립적 인 키 스트로크 (keystroke)로서 유지되고, 이는 후크에 의해 캡쳐된다.

후크 : 나는 플래그를 사용하는 것을 시도했다, 그러나이 중 하나가 작동하는 것 같지 않았어요

private void performCombo(int n) 
     { 
      string simpleAction; 
      Sleep(cmbDelay); 
      Key k = new Key(); 
      switch (n) 
      { 
       case 1: 
        k = Key.D1; 
        break; 
       case 2: 
        k = Key.D2; 
        break; 
       case 3: 
        k = Key.D3; 
        break; 
       case 4: 
        k = Key.D4; 
        break; 
       case 5: 
        k = Key.D5; 
        break; 
       case 6: 
        k = Key.D6; 
        break; 
      } 
     if ((Keyboard.GetKeyStates(k) & KeyStates.Down) > 0) 
      Sleep(1000); 
     do 
     { 
      if (comboList[n - 1].Count > 0) 
      { 
       foreach (string action in comboList[n - 1]) 
       { 
        simpleAction = action.Split('~')[0]; 
        if (simpleAction.Length == 1) 
        { 
         dkeyinput(simpleAction, gamePid, 500); 
         Sleep(cmbDelay); 
        } 
        else 
        { 
         if (simpleAction == "LeftClick") 
         { 
          dmouseclick("left", 300); 
          Sleep(cmbDelay); 
         } 
         else if (simpleAction == "RightClick") 
         { 
          dmouseclick("right", 300); 
          Sleep(cmbDelay); 
         } 
         else if (simpleAction == "Space") 
         { 
          dkeyinput("\"{SPACE}\"", gamePid); 
          Sleep(cmbDelay); 
         } 
         else if (simpleAction.Contains("&")) 
         { 
          dkeyinput2(simpleAction, cmbDelay); 
          Sleep(cmbDelay); 
         } 
        } 
       } 
      } 
     } 
     while ((Keyboard.GetKeyStates(k) & KeyStates.Down) > 0); 


    } 

private IntPtr HwndHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
    { 

     const int WM_HOTKEY = 0x0312; 
      switch (msg) 
      { 
       case WM_HOTKEY: 
        if (battleBotStatus == 0) 
        { 
         switch (wParam.ToInt32()) 
         { 

          case HOTKEY_ID: 
           OnHotKeyPressed(); 
           handled = true; 
           break; 

          case HOTKEY_ID9: 
           enableBattleBotKeys(); 
           battleBotStatus = 1; 
           //performCombo(); 
           handled = true; 
           break; 
         } 
        } 
        else 
        { 
         switch (wParam.ToInt32()) 
         { 

          case BattleKey1: 
           performCombo(1); 
           handled = true;          
           buttonIsPressed = false; 
           break; 
         } 
        } 
        break; 
      } 
     return IntPtr.Zero; 
    } 

PerformCombo 코드입니다. 디버거 사용을 검사 할 때, 키를 놓은 후에도 항상 처리기로 이동하여 계속해서 BattleKey1 경우에 대한 작업을 수행합니다. 당신이 최대 콤보 시간을 알고있는 경우

+0

나는 왜 당신이 잠을 자고 있는지 모르지만 ... 그렇습니다. 일반적으로 입력 이벤트 (다중 키/마우스 클릭)를 결합하려면 값과 시작 시간을 저장하고 현재 시간을 기준으로 새 이벤트를 확인하고 비교해야합니다. 이렇게하면 몇 가지 이벤트를 "이벤트 스트림"(콤보)에 결합하는 데 도움이됩니다. – Shakra

+0

@Shakra 이런 종류의 문제에 이벤트 스트림을 적용하는 방법을 모르겠습니다. 잠은 행동 사이에 지연을 일으킬뿐입니다. 내가 데리고 나가면, 아주 많은 작업 만 처리됩니다. –

답변

0

빠른 해결 방법으로 : 는 do-while befor를 새로운 DateTime 변수를 추가 :

var comboStart = DateTime.Now; 
do{...}while 

do-while에서 시간 체크를 추가

while ((Keyboard.GetKeyStates(k) & KeyStates.Down) > 0 || 
(DateTime.Now - comboStart).TotalSeconds > maxComboTimeInSeconds); 

이 응용 프로그램을 삭제하지 않을 freezes (이 방법을 비동기로 실행해야합니다.) 이렇게하려면 do-while에 대한 단호한 사례를 만들 것입니다. 시간.