0
私はthis回答で提示されているようにキーボードフックを実装しました。 1つのケースを除いてすべてが正常に動作します。私はいくつかの時間のために押されたキーを押したままにしたい場合は、このように技術的に2つの事が起こる、私は呼んでいる方法でremaning:キーボードフック格納キー
- 私は
- (良いです)メソッドに残るアプリケーションレコードキーは独立したキーストロークとして押され、フックによって捕捉される。
フック:
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
の場合のアクションが連続して実行されることに気付きました。高速な回避策として
私はあなたがなぜ睡眠を使用しているのかわかりませんが、それは事実です。 通常、入力イベント(複数のキー/マウスのクリック)を組み合わせたい場合は、値と開始時間を保存し、emをチェックして現在の時間に基づいて新しいものと比較する必要があります。これは、少数のイベントを「イベントストリーム」(コンボ)に結合するのに役立ちます。 – Shakra
@Shakraこの種の問題でイベントストリームをどのように適用するのか分かりません。睡眠は、行動の間に遅れを生じさせるだけです。私がそれらを取る場合、非常に操作だけが処理されます –