问题
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