在我的键盘钩子中,每次按键都会有一个标志,表明它是否被注入。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.这是二进制00010000,十六进制为0x10。所以,你按位与它为0x10,并查看是否有左:

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

(当然,按照安德鲁的答案,这将是一个好主意来定义这个LLKHF_INJECTED不变,而不是直接包括代码的十六进制值!)

其他提示

.NET支持这与[旗]属性:

[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..
  }

使用位AND运算符来检查相关位在标志中设置变量:

if (kbd.flags & LLKHF_INJECTED)
{
    ...
}

您需要检查位标志是否已设置。按位运算很容易完成。文档指出,第 4 位用于注入标志,第 4 位(如果将第一个位计为 1,则为 5)等于 16,因此您可以对标志执行按位 AND 运算。

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

您可以在此处了解有关按位运算的更多信息:

大家的原因是说使用按位&然后比较为零或标志:

  0111 1000        // kbd.flags 
& 0001 0000        // Injected
          =
  0001 0000        // (!= 0 or ==Injected)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top