How do I use low-level 8 bit flags as conditionals?

孤者浪人 提交于 2019-12-22 05:36:17

问题


In my keyboard hook, each keypress gets a flag that states if it was injected or not. http://msdn.microsoft.com/en-us/library/ms644967(VS.85).aspx

I've distilled a KBDLLHOOKSTRUCT from the lParam. I can access kbd.flags.XXX. I just don't know how to convert this 8bit flag into an if (injected) {... type conditional that I know how to use.

If one of you smart computer-science types would help me out I'd really appreciate it.

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

        //if (injected) {...

Cheers!


回答1:


You need to bitwise-and it with a mask. For example, the injected bit is bit 4. That's binary 00010000, hex 0x10. So you bitwise-and it with 0x10, and see if anything's left:

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

(Of course, as per Andrew's answer, it would be a good idea to define a LLKHF_INJECTED constant for this rather than including the hex value directly in your code!)




回答2:


.NET supports this with the [Flags] attribute:

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

Sample usage:

  KBDLLHOOKSTRUCT info = (KBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
  if ((info.flags & KbdHookFlags.Released) == KbdHookFlags.Released) {
    // Key was released
    // etc..
  }



回答3:


Use the bitwise AND operator to check if the relevant bit is set in the flags variable:

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



回答4:


You need to check that the bitflag is set. Easy to do with bitwise operations. The documentation states that bit four is used for the injected flag, bit 4 (or 5 if you count the first bit as 1) equals 16, so you can do a bitwise AND against the flag.

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

You can learn more about bitwise operations here:

  • Bitwise operation and usage
  • http://en.wikipedia.org/wiki/Bitwise_operation
  • http://en.wikipedia.org/wiki/Mask_(computing)



回答5:


The reason everyone is saying to use a bitwise & and then compare to zero or the flag:

  0111 1000        // kbd.flags 
& 0001 0000        // Injected
          =
  0001 0000        // (!= 0 or ==Injected)


来源:https://stackoverflow.com/questions/2075811/how-do-i-use-low-level-8-bit-flags-as-conditionals

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!