当挂接 Windows 的消息循环时,KBDLLHOOKSTRUCT 的 dwExtraInfo 有什么用
When hooking Window's message loop, what's KBDLLHOOKSTRUCT's dwExtraInfo for
我尝试挂接一个窗口的wnd进程,突然出现了一个野生变量。。。
好的,让我再描述一下我的问题。我调用了一些函数从C#访问C++WinApi。我想把一些击键从一个窗口复制到另一个窗口(也就是魔兽世界和其他MMO中的双重拳击)P/Invoking工作得很好,我很高兴,但我不知道变量dwExtraInfo
是用来做什么的。这个字段的文档只是重复了名称本身已经说过的内容。。。
定义如下:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644967(v=vs.85).aspx
或者对于懒惰的人(我也是其中之一:p):
[StructLayout(LayoutKind.Sequential)]
public class KBDLLHOOKSTRUCT
{
public uint vkCode;
public uint scanCode;
public KBDLLHOOKSTRUCTFlags flags;
public uint time;
public UIntPtr dwExtraInfo;
}
当我想将这些数据发送到游戏(SendMessage,其中WPARAM设置为WM_KEYDOWN
和WM_KEYUP
)时,我将vkCode设置为WPARAM,并从此结构构建LPARAM。dwExtraInfo只是一条消息中的击键次数吗?
例如,我按住w-key
大约10秒,它是否在发送下一条消息之前存储了一个间隔中的击键量?
这个变量真的让我很困惑…
它表示"额外的";开发人员在使用LowLevelKeyboardProc
时可以使用的信息,例如,用于指示特定或特殊类型的键盘事件(如人工生成的击键)。在LowLevelKeyboardProc
中,lParam
是指向保持dwExtraInfo.
的KBDLLHOOKSTRUCT
的指针
下面是一个很好的例子:https://web.archive.org/web/20170710091853/http://globalmousekeyhook.codeplex.com/discussions/286784
虽然dwExtraInfo
是指针,但在该示例中,他们只是将其设置为任意值111
。
它与您在keybd_event()中看到的值完全相同。或者SendInput()使用的KEYBDINPUT结构。或者从GetMessageExtraInfo()中获得的信息。描述它:
额外消息信息是与当前线程的消息队列相关联的应用程序或驱动程序定义的值。
因此,只要您没有向使用keybd_event()或SendInput()生成的键盘消息添加任何额外信息,或者驱动程序没有添加任何内容(默认键盘驱动程序没有),那么您就不会对该字段感兴趣。