Wf_event.c
回调函数
①LRESULT CALLBACK wf_event_proc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
GetWindowLongPtr(hWnd, GWLP_USERDATA);在指定的窗口中获取信息。
GWLP_USERDATA 获取窗口关联的数据,是应用程序创建窗口时留给用户的数据。初始值是0。
②LRESULT CALLBACK wf_ll_kbd_proc(int nCode, WPARAM wParam, LPARAM lParam)
PKBDLLHOOKSTRUCT 是WH_KEYBOARD_LL钩子回调函数所使用的结构体。WH_KEYBOARD_LL是一个系统级的钩子“low-level keyboard Hook”,可以截获系统热键的消息。
MSDN中的结构说明和定义如下:
DWORD vkCode; // virtual key code
DWORD scanCode; // scan code
DWORD flags; // flags
DWORD time; // time stamp for this message
DWORD dwExtraInfo; // extra info from the driver or keybd_event
} KBDLLHOOKSTRUCT, FAR * LPKBDLLHOOKSTRUCT, * PKBDLLHOOKSTRUCT;
参数是VK_LEFT、VK_RIGHT、VK_UP、VK_DOWN之类的,具体可以参见MSDN的文档:http://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx 返回值是按键的状态,可以得到的状态是它是否按下,上一次调用此函数时,按键是否按下。 以下代码就是测试按键是否处于按下状态:if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f )
do something...
1、&与操作,&0x8000就是判断这个返回值的high-order bit(高位字节)
2、如果high-order bit是1,则是按下状态,否则UP状态
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
说明一下,带的参数要是虚拟打描码,比如"UP"的码是 VK_DOWN ,"ESC"是 VK_ESCAPE。
GetAsyncKeyState 取异步键状态。
比如,一般情况下,你可以在操作系统的控制面板中设置鼠标左右键的映射(实际的鼠标左键可以映射成右键点击事件),或者通过程序也可以这样设置,这样就产生了物理键状态(实际的),逻辑键状态(虚拟的,)。使用 GetKeyState,GetKeyboardState,等函数得到的就是逻辑键状态。
而GetAsyncKeyState 读取的是物理键状态,也是就是不管你怎么鼠标键盘映射,它只读取实际的按键状态。