0

フック プロシージャ内で、使用済みが SHIFT を押して (離さずに) 押してから char キー (A など) を押しているかどうかを判断するにはどうすればよいですか?

たとえば、Shift+A を押すと、Shift、a のように取得するのではなく、大文字の a になることを知りたい

ユーザーが Shift を押して放すと、Shift のみがキャプチャされます。

インストールされたフックは WH_KEYBOARD (グローバル) です

function KeyHookProc(Code: Integer; wVirtKey: WPARAM; lKeyStroke: LPARAM)
  : LRESULT; stdcall;
type
  TTransitionState = (tsPressed, tsReleased);

  PKeystrokeData = ^TKeystrokeData;

  TKeystrokeData = record
    VirtualKey: WPARAM;
    KeyStroke: LPARAM;
    KeyState: TKeyboardState;
  end;
var
  Transition: TTransitionState;
  KeystrokeDataPtr: PKeystrokeData;
begin
  Result := CallNextHookEx(hKeyHook, Code, wVirtKey, lKeyStroke);

  Transition := TTransitionState((lKeyStroke shr 31) and 1);

  if (Code = HC_ACTION) and (Transition = tsPressed) then
  begin
    New(KeystrokeDataPtr);
    try
      KeystrokeDataPtr^.VirtualKey := wVirtKey;
      KeystrokeDataPtr^.KeyStroke := lKeyStroke;
      GetKeyboardState(KeystrokeDataPtr^.KeyState);
      SendMessage(hConsole, WM_NULL, 0, LPARAM(KeystrokeDataPtr));
    finally
      Dispose(KeystrokeDataPtr);
    end;
  end;
end;
4

2 に答える 2

3

以下は、シフト キーを検出するために日常的に使用するコードです。フックされたコンテキストで使用したことがないため、そこで機能するかどうか、またはそのコンテキストでそれを妨げる何かが異なるかどうかはわかりません。

function ShiftIsDown : Boolean;
var
  State: TKeyboardState;
begin
  WINDOWS.GetKeyboardState(State);
  Result := ((State[vk_Shift] and 128) <> 0);
end; 
于 2013-05-05T14:33:57.000 に答える
0

SHIFTフック プロシージャがwParamequal toで呼び出されたときに、キーが押されたことを検出しますVK_SHIFT

押されたキーに対応してフック プロシージャが呼び出されると、Aキーが押されているかどうかに関係なく、wParamとの値は同じです。通常のメッセージ ループで発生するような呼び出しを行っていないため、生のキー ダウン/アップ イベントを実際のキー押下に変換する必要があります。lParamSHIFTTranslateMessageDispatchMessage

キーが押されてGetKeyState(VK_SHIFT)<0いるかどうかを検出するために使用するのがおそらく最も簡単でしょう。SHIFTそれはまさにあなたがやろうとしていることによって異なります。完全に機能するキーロガーを作成しているように見えます。その場合、 へのアドホック呼び出しはGetKeyState(VK_SHIFT)<0ニーズを満たさない可能性があり、個々のキー ダウン/アップ メッセージを適切に処理する方が適切です。


その他のコメント:

  1. なぜTKeystrokeDataレコードをヒープに割り当てるのですか? スタックに割り当てられたレコードを完全にうまく使用できます。
  2. hConsoleそれがあなたのフックと同じプロセスのウィンドウであることを願っています. そうでない場合、送信するポインターはそれを定義するプロセスでのみ意味があるため、有用な情報を受け取りません。クロスプロセスで情報を送信したい場合は、それらWM_COPYDATAがあなたの男です。
于 2013-05-05T15:09:57.720 に答える