6

在我的键盘钩子中,每个按键都会获得一个标志,表明它是否被注入。 http://msdn.microsoft.com/en-us/library/ms644967(VS.85).aspx

我从 lParam 中提取了一个 KBDLLHOOKSTRUCT。我可以访问 kbd.flags.XXX。我只是不知道如何将这个 8 位标志转换为if (injected) {...我知道如何使用的条件类型。

如果你们中的一个聪明的计算机科学类型能帮助我,我会非常感激。

    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,十六进制 0x10。所以你用 0x10 逐位计算,看看是否还剩下什么:

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

(当然,根据 Andrew 的回答,最好为此定义一个 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,因此您可以对标志执行按位与操作。

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 回答