通过Qt截图工具讲注册热键的实现
2016-08-06 09:24
260 查看
截图是很常用的功能,windows原生的截图工具一次只能截一张而且需要手动保存。于是我编写了一个工具,可以多次截图,并存储到用户指定的目录。Qt5中提供了截图功能,即QScreen::grabWindow(WId)方法,在Qt4中则是QPixmap::grabWindow(WId),使用起来比较方便,也没有太多的技术细节。这个工具中,比较实用可以借鉴的功能是注册系统热键和单例程序(即本程序只能运行一个),都是使用windows API实现的。
注册系统热键:需要了解一个概念,Atom。它是一种数据类型,它的值代表的是系统原子表中的一个原子值。原子就可以理解为唯一的意思,因为我们要注册系统热键,这个热键必须在系统中可查并且是唯一(重复了就会引起热键冲突)的,Atom起到的就是这个作用。创建一个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参数的宏说明如下(摘自百度百科):
而vk则是虚拟键码,具体的码值可以参照https://msdn.microsoft.com/en-us/library/dd375731(v=vs.85).aspx,这个是MSDN上比较权威的内容。那么举个例子,注册ctrl+F1为系统热键的语句如下:
ATOM atom = GlobalAddAtom("jietu");
这套代码照搬即可,没有太多的活动空间,需要说明几点: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
注册系统热键:需要了解一个概念,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键。 |
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
相关文章推荐
- 基于Qt的截图工具,实现截图后进行编辑
- 基于Qt的截图工具,实现截图后进行编辑
- 用Qt实现类似QQ截图的工具
- 基于Qt的截图工具,实现截图后进行编辑
- 基于Qt的截图工具,实现截图后进行编辑
- 基于Qt的截图工具,实现截图后进行编辑
- C#软件开发实例.私人订制自己的屏幕截图工具(二)创建项目、注册热键、显示截图主窗口
- 基于Qt的截图工具,实现截图后进行编辑
- 用qt实现类似qq截图的工具
- 用qt实现类似qq截图的工具
- 基于Qt的截图工具,实现截图后进行编辑
- 基于Qt的截图工具,实现截图后进行编辑
- Qt 实现 QQ 截图工具(开源OEasyScreenshot)
- 用Qt实现类似QQ截图的工具
- C#软件开发实例.私人订制自己的屏幕截图工具(二)创建项目、注册热键、显示截图主窗口
- 【推荐】免费好用的拷屏工具、截图工具,支持热键、可选区域、可保存为jpg,bmp文件,可复制到剪贴板
- qt通过pri文件实现预编译处理
- C#实现注册全局热键(register hot key)
- ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能
- ASP.NET jQuery 食谱12 (通过使用jQuery validation插件简单实现用户注册页面验证功能)