FreeRDP

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中的结构说明和定义如下:

typedef  struct  tagKBDLLHOOKSTRUCT  {
    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;
 
SHORT GetAsyncKeyState(int vKey); 参数vKey是某个按键的虚拟码(很多虚拟码跟其ASCII码数值上相等,但不代表全部。)
GetAsyncKeyState用于得到当前键盘、鼠标等按键的状态,因此,如果一个key它是一直处于down的状态,那么调用这个函数都可以获得它的状态。这在游戏控制中是非常有用的。

参数是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... 
 
你不要简单地检测GetAsyncKeyState的返回值是否非零,因为如果在这个函数运行前指定的键已经被按过,则这个函数的返回值的位0为1;如果这个键目前处于按下状态,则位15为1。所以你检测位15是否为1就可以知道这个键是曾经被按过还是正在被按着。
 
还有一个API函数GetKeyState是只检测按键的当前状态的,但仍然要检测位15是否为1(位0为1表示开关键打开,即CapsLock、NumLock、ScrollLock键)。
 
调用GetAsyncKeyState函数得到某个键的状态,然后判断返回值的最高位是不是1,如果是表示这个处于按下状态
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 读取的是物理键状态,也是就是不管你怎么鼠标键盘映射,它只读取实际的按键状态。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值