题
在我的键盘钩子中,每次按键都会有一个标志,表明它是否被注入。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)
不隶属于 StackOverflow