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 读取的是物理键状态,也是就是不管你怎么鼠标键盘映射,它只读取实际的按键状态。

FreeRDP 是一个开源的远程桌面协议(RDP)客户端和服务器实现。以下是一些 FreeRDP 相关信息: - **代码结构**:可查看链接了解其代码结构,链接为 http://www.freerdp.com/api/annotated.html [^1]。 - **资料获取**:在资料方面,可访问 https://github.com/FreeRDP/FreeRDP/wiki 获取相关内容 [^1]。 - **RDP 协议文档**:RDP 协议文档可在 https://github.com/FreeRDP/FreeRDP/wiki/Reference-Documentation 查看 [^1]。 - **编译信息**: - **Windows 编译(with openh264)**:在 Windows 中编译时,有用户遇到自己编译的 node - freerdp2 模块在 Windows 7 会报错,与 Windows 的 media_foundation 相关,重装系统后 100% 复现,报错内容如 [ERROR][com.freerdp.codec] - QueryInterface(IID_ICodecAPI) failure: 0x80004002 等,可尝试把 openh264 编译进来 [^2]。 - **CentOS 安装**:在 CentOS 上安装,需先安装依赖包,命令如下: ```bash sudo -i yum install -y pkgconfig sudo -i yum install cmake sudo yum install gcc cmake openssl-devel libX11-devel libXext-devel libXinerama-devel libXcursor-devel libXdamage-devel libXv-deve libxkbfile-devel cups-devel alsa-lib-devel pcsc-lite-devel -y sudo yum install libwinpr-devel -y sudo rpm -ivh freerdp-devel-2.0.0-1.rc4.el7.x86_64.rpm # 下载rpm文件 yum -y install freerdp ``` [^3] - **编译依赖库**:编译 freerdp 需要安装一些依赖库,在相关系统上可使用以下命令: ```bash sudo apt-get install build-essential git-core debhelper cdbs dpkg-dev autotools-dev cmake pkg-config xmlto libssl-dev docbook-xsl xsltproc libxkbfile-dev libx11-dev libwayland-dev libxrandr-dev libxi-dev libxrender-dev libxext-dev libxinerama-dev libxfixes-dev libxcursor-dev libxv-dev libxdamage-dev libxtst-dev libcups2-dev libpcsclite-dev libasound2-dev libpulse-dev libjpeg-dev libgsm1-dev libusb-1.0-0-dev libudev-dev libdbus-glib-1-dev uuid-dev libxml2-dev sudo apt-get install libcairo2-dev ``` [^5] - **GDI 加速扩展**:在主要绘图操作需要渲染时,必须出现在特定的缓存,如呈现九宫图需出现在九宫图缓存。服务器首先会由 PUDS 调用二级操作指令,将图形数据保存到缓存,然后调用主要绘图指令将数据绘制到屏幕上 [^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值