您的位置:首页 > 编程语言 > Qt开发

通过Qt截图工具讲注册热键的实现

2016-08-06 09:24 260 查看
       截图是很常用的功能,windows原生的截图工具一次只能截一张而且需要手动保存。于是我编写了一个工具,可以多次截图,并存储到用户指定的目录。Qt5中提供了截图功能,即QScreen::grabWindow(WId)方法,在Qt4中则是QPixmap::grabWindow(WId),使用起来比较方便,也没有太多的技术细节。这个工具中,比较实用可以借鉴的功能是注册系统热键和单例程序(即本程序只能运行一个),都是使用windows API实现的。

      注册系统热键:需要了解一个概念,Atom。它是一种数据类型,它的值代表的是系统原子表中的一个原子值。原子就可以理解为唯一的意思,因为我们要注册系统热键,这个热键必须在系统中可查并且是唯一(重复了就会引起热键冲突)的,Atom起到的就是这个作用。创建一个Atom的语句:

Atom atom = GlobalAddAtom("jietu");
      双引号之间的内容可以自由设置。程序运行结束后还要销毁Atom,语句:

GlobalDeleteAtom(atom);

      其中的atom就是上句代码中创建的Atom变量。有了原子值以后,就可以创建系统热键了,使用的API是RegisterHotKey(HWND hWnd, int id, UINT fsModifiers, UINT vk)。第一个参数是窗口句柄,因为热键生效后要向指定窗口发消息,以获得激活热键后的处理。一般这个窗口指的就是我们的程序窗口。在Qt中一般这样写:(HWND)this->winId(),就可以获取当前窗口的句柄了。第二个参数id就是原子值,将atom传入即可。最后两个参数是按键,这个API只支持两个按键的组合,比如ctrl+F1,虽然方法中两个按键类型一样,但是传入的宏却不同。fsModifiers参数的宏说明如下(摘自百度百科):


含意
MOD_ALT
0x0001按下的可以是任一Alt键。
MOD_SHIFT
0x0004按下的可以是任一Shift键。
MOD_WIN
0x0008按下的可以是任一Windows徽标键。
MOD_NOREPEAT
0x4000更改热键行为,以便键盘自动重复不会产生多个热键通知。
MOD_CONTROL
0x0002按下的可以是任一Ctrl键。
而vk则是虚拟键码,具体的码值可以参照https://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx,这个是MSDN上比较权威的内容。那么举个例子,注册ctrl+F1为系统热键的语句如下:
ATOM atom = GlobalAddAtom("jietu");
RegisterHotKey((HWND)this->winId(), atom, MOD_CONTROL,  VK_F1);
       以上是注册系统热键的内容,热键被激活以后,我们要获得这个消息并进行处理。在Qt中是通过重载bool nativeEvent(const QByteArray &eventType, void *message, long *result)这个方法来实现的,在dialog.h文件中声明后,dialog.cpp中的实现代码如下:
bool Dialog::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
if (eventType == "windows_generic_MSG")
{
MSG *msg = (MSG *)message;
if (msg->message == WM_HOTKEY)
{
qDebug()<<"这里进行处理……";
return true;
}
else
return QDialog::nativeEvent(eventType, message, result);
}
else
return false;
}


       这套代码照搬即可,没有太多的活动空间,需要说明几点:1.WM_HOTKEY宏代表的是消息类型,该值为热键激活。而非热键激活的消息,要通过调用QDialog的nativeEvent()方法进行处理,否则程序会崩溃,因为Qt程序在windows平台下就是通过windows API实现的,还有大量的消息处理需要通过nativeEvent()方法进行。2.该方法是Qt5中的方法,Qt4应使用bool QWidget::winEvent ( MSG
* message, long * result )方法,实现过程类似,限于篇幅不再说明。3.虽然激活热键以后需要通过窗口进行处理,但是窗口只要存在即可,比如最小化、隐藏等状态下仍可正常进行,这也是为什么截图工具仅显示托盘图标就能截图的原因。
最后贴上截图工具的代码+可执行程序的下载地址:http://download.csdn.net/detail/u012952807/9596563
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: