2017-02-27 13 views
0

私はthis回答で提示されているようにキーボードフックを実装しました。 1つのケースを除いてすべてが正常に動作します。私はいくつかの時間のために押されたキーを押したままにしたい場合は、このように技術的に2つの事が起こる、私は呼んでいる方法でremaning:キーボードフック格納キー

  1. 私は
  2. (良いです)メソッドに残るアプリケーションレコードキーは独立したキーストロークとして押され、フックによって捕捉される。

フック:

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コード

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); 


    } 

私はフラグを使用しようとしましたが、彼らはどちらか動作していないようでした。デバッガの使用を調べると、キーが離された後でも、常にハンドラに移動し、連続してBattleKey1の場合のアクションが連続して実行されることに気付きました。高速な回避策として

+0

私はあなたがなぜ睡眠を使用しているのかわかりませんが、それは事実です。 通常、入力イベント(複数のキー/マウスのクリック)を組み合わせたい場合は、値と開始時間を保存し、emをチェックして現在の時間に基づいて新しいものと比較する必要があります。これは、少数のイベントを「イベントストリーム」(コンボ)に結合するのに役立ちます。 – 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(これを行うにはこの方法をAsyncで実行する必要があります)、do-whileの場合は、 ong時間。

関連する問題