6

私のキーボード フックでは、キーを押すたびに、キーが挿入されたかどうかを示すフラグを取得します。 http://msdn.microsoft.com/en-us/library/ms644967(VS.85).aspx

lParam から KBDLLHOOKSTRUCT を抽出しました。kbd.flags.XXX にアクセスできます。if (injected) {...この 8 ビット フラグを、使用方法を知っている条件付き型に変換する方法がわかりません。

賢いコンピュータ サイエンス タイプの誰かが私を助けてくれたら、本当に感謝します。

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        KBDLLHOOKSTRUCT kbd = new KBDLLHOOKSTRUCT();
        Marshal.PtrToStructure(lParam, kbd);

        //if (injected) {...

乾杯!

4

5 に答える 5

11

.NET は [Flags] 属性でこれをサポートします。

[Flags]
enum KbdHookFlags {
  Extended = 0x01,
  Injected = 0x10,
  AltPressed = 0x20,
  Released = 0x80
}

使用例:

  KBDLLHOOKSTRUCT info = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
  if ((info.flags & KbdHookFlags.Released) == KbdHookFlags.Released) {
    // Key was released
    // etc..
  }
于 2010-01-16T01:42:41.990 に答える
7

ビットごとにマスクする必要があります。たとえば、挿入されたビットはビット 4 です。これはバイナリ 00010000、16 進 0x10 です。したがって、0x10 でビットごとに計算し、何か残っているかどうかを確認します。

bool isInjected = ((kbd.flags & 0x10) != 0);

(もちろん、Andrew の回答によると、16 進値をコードに直接含めるのではなく、LLKHF_INJECTED 定数を定義することをお勧めします!)

于 2010-01-16T01:22:19.380 に答える
2

ビットごとの AND 演算子を使用して、関連するビットが flags 変数に設定されているかどうかを確認します。

if (kbd.flags & LLKHF_INJECTED)
{
    ...
}
于 2010-01-16T01:22:26.823 に答える
2

ビットフラグが設定されていることを確認する必要があります。ビット単位の操作で簡単に実行できます。ドキュメンテーションには、挿入されたフラグにビット 4 が使用され、ビット 4 (または最初のビットを 1 としてカウントする場合は 5) は 16 に等しいため、フラグに対してビットごとの AND を実行できると記載されています。

if ((kbd.flags & 16) == 16)
{
    FireTorpedoes();
}

ビット演算の詳細については、次を参照してください。

于 2010-01-16T01:23:18.007 に答える
2

誰もがビットごとの & を使用してからゼロまたはフラグと比較すると言っている理由:

  0111 1000        // kbd.flags 
& 0001 0000        // Injected
          =
  0001 0000        // (!= 0 or ==Injected)
于 2010-01-16T09:29:44.577 に答える