大家好,欢迎来到IT知识分享网。
Qt是一个跨平台开发的框架,可以实现一套代码多平台编译运行。但是有时候我们想实现的功能却和平台深度挂钩,比如本文想要描述的键盘钩子,也就是KeyBoard Hook。在Windows平台开发时,如果我们需要监听键盘的操作或者屏蔽一些键盘操作时,比较容易的办法就是使用Windows 自带的API,包含SetWindowsHookEx、CallNextHookEx、UnhookWindowsHookEx。但是Mac系统下是没有这些API供我们使用的,那么在使用Qt进行跨平台开发时,我们该如何做呢?
可以想到的办法就是使用条件编译的方式,让我们的软件能够在Windows平台下先支持键盘钩子。那如果进行条件编译呢,主要需要关注以下几个地方:
1.首先需要在Qt的工程文件中,添加lib文件user32.lib,因为该lib是一个系统lib,所以我们只需要指定名称即可,需要注意的是我们希望是只在win系统下引入库,所以我们可以进行lib引用的限定(也可以通过在项目节点上右键,添加库的方式添加,效果一样),如下所示:
2.windows.h文件的导入,QT已经自带一些预定义宏来标识系统类型,如Q_OS_WIN代表windows系统,Q_OS_MAC代表MAC OS,这些内容可以查看帮助文档。此时,我们将windows.h的include操作就可以放到一个系统类型判断条件中了,如下所示:
这样一来,当把整个功能移植到MAC上进行编译时,由于条件不满足,所以也就不会引入这个windows.h文件。
3.安装钩子以及卸载钩子的操作,也可以放到条件编译中去,如图:
这样确保函数的定义都在Windows系统下定义和实现,在其他平台编译时不会出错。
4.最后一步就是调用时夜的根据不同的系统去调用,比如当前是Windows,那么我们就可以调用这些定义的API。
这些是本人在研究跨平台桌面程序开发时遇到的关于与平台挂钩的键盘钩子功能时的处理方式。
附上本人的键盘钩子代码。
Hook.h
#ifndef HOOK_H #define HOOK_H #include<QObject> #ifdef Q_OS_WIN #include"Windows.h" class Hook { public: Hook(); void installHook(); void unInstallHook(); }; #endif #endif // HOOK_H
Hook.c
#include "hook.h" #include<QDebug> #ifdef Q_OS_WIN Hook::Hook() { } static HHOOK keyHook=nullptr; LRESULT CALLBACK keyProc(int nCode,WPARAM wParam,LPARAM lParam) { KBDLLHOOKSTRUCT *pkbhs=(KBDLLHOOKSTRUCT*)lParam; if(nCode == HC_ACTION){ if(pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL)& 0x8000 && GetAsyncKeyState(VK_SHIFT)&0x8000){ qDebug() << "Ctrl+Shift+Esc"; }else if(pkbhs->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL) & 0x8000){ qDebug() << "Ctrl+Esc"; }else if(pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN){ qDebug() << "Alt+Tab"; }else if(pkbhs->vkCode == VK_ESCAPE && pkbhs->flags &LLKHF_ALTDOWN){ qDebug() << "Alt+Esc"; }else if(pkbhs->vkCode == VK_LWIN || pkbhs->vkCode == VK_RWIN){ qDebug() << "LWIN/RWIN"; }else if(pkbhs->vkCode == VK_F4 && pkbhs->flags & LLKHF_ALTDOWN){ qDebug() << "Alt+F4"; } return 1;//返回1表示截取消息不再传递,返回0表示不作处理,消息继续传递 } return CallNextHookEx(keyHook, nCode, wParam, lParam); } void Hook::unInstallHook() { if(keyHook!=nullptr) { UnhookWindowsHookEx(keyHook);//键盘钩子句不为空时销毁掉 keyHook=nullptr; } if(keyHook!=nullptr) { UnhookWindowsHookEx(keyHook);//键盘钩子句不为空时销毁掉 keyHook=nullptr; } } void Hook::installHook() { keyHook =SetWindowsHookEx( WH_KEYBOARD_LL,keyProc,nullptr,0); qDebug() << "0"; } #endif
Qt学习路线:Qt开发技术栈
Qt资料领取:Qt资料领取(视频教程+文档+代码+项目实战)
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/109177.html