Windows下QT实现托盘程序及系统托盘刷新
目录
一、现象
二、托盘程序的QT实现
1、功能说明
2、使用的类
3、代码实现
三、windows系统托盘刷新
1、托盘刷新代码
2、托盘刷新代码的调用
一、现象
windows下当程序关闭,有时系统右下角的系统托盘图标还会存在。如不停的关闭和打开程序,任务栏右下角通知区域,同一个图标重复很多。Qt使用QSystemTrayIcon类开发时,也会存在这个问题。如何解决?
方法是调用windows API。
二、托盘程序的QT实现
1、功能说明
对于Qt GUI程序,如果想要实现当最小化时,程序从任务栏消失,在系统托盘显示一个图标,表示此程序,并能在托盘内通过双击或者菜单使程序界面恢复。
2、使用的类
主要使用的此类:QSystemTrayIcon。其中QSystemTrayIcon是主要操作系统托盘的操作类,通过此类,可以在托盘显示指定程序的图标,显示指定消息,显示菜单等。
3、代码实现
#ifndef TESTTRAYICON_H
#define TESTTRAYICON_H#include <QtGui/QMainWindow>
#include "ui_testtrayicon.h"class testTrayIcon : public QMainWindow
{Q_OBJECTpublic:testTrayIcon(QWidget *parent = 0, Qt::WFlags flags = 0);~testTrayIcon();private:Ui::testTrayIconClass ui;
};#endif // TESTTRAYICON_H
#include "testtrayicon.h"
#include <QSystemTrayIcon>
testTrayIcon::testTrayIcon(QWidget *parent, Qt::WFlags flags): QMainWindow(parent, flags)
{ui.setupUi(this);QIcon icon = QIcon( ":/logo.png" );QSystemTrayIcon *trayIcon = new QSystemTrayIcon( this );trayIcon->setIcon(icon);trayIcon->setToolTip(tr( "hello" ));QString titlec=tr( "hello" );QString textc=tr( "hello" );trayIcon->show();trayIcon->showMessage(titlec,textc,QSystemTrayIcon::Information,5000);QMenu*pMenu=new QMenu(this);pMenu->addAction("test1");pMenu->addAction("test2");trayIcon->setContextMenu(pMenu);
}testTrayIcon::~testTrayIcon()
{}
#include "testtrayicon.h"
#include <QtGui/QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);testTrayIcon w;//w.show();w.hide();return a.exec();
}
三、windows系统托盘刷新
1、托盘刷新代码
#ifdef WIN32
#include <Windows.h>
void RefreshIcon()//任务栏图标刷新一遍
{
//任务栏窗口 HWND hShellTrayWnd = FindWindow(L"Shell_TrayWnd",NULL);
//任务栏右边托盘图标+时间区
HWND hTrayNotifyWnd = FindWindowEx(hShellTrayWnd,0,L"TrayNotifyWnd",NULL); //不同系统可能有可能没有这层
HWND hSysPager = FindWindowEx(hTrayNotifyWnd,0,L"SysPager",NULL);
//托盘图标窗口
HWND hToolbarWindow32;
if (hSysPager)
{
hToolbarWindow32 = FindWindowEx(hSysPager,0,L"ToolbarWindow32",NULL);
}else
{
hToolbarWindow32 = FindWindowEx(hTrayNotifyWnd,0,L"ToolbarWindow32",NULL);
}
if (hToolbarWindow32)
{
RECT r;
GetWindowRect(hToolbarWindow32,&r);
int width = r.right - r.left;
int height = r.bottom - r.top;
//从任务栏中间从左到右 MOUSEMOVE一遍,所有图标状态会被更新
for (int x = 1; x<width; x++)
{
SendMessage(hToolbarWindow32,WM_MOUSEMOVE,0,MAKELPARAM(x,height/2));
} } }
#endif
2、托盘刷新代码的调用
#include "testtrayicon.h"
#include <QSystemTrayIcon>
#ifdef WIN32
#include <Windows.h>
void RefreshIcon()//任务栏图标刷新一遍
{ //任务栏窗口 HWND hShellTrayWnd = FindWindow(L"Shell_TrayWnd",NULL); //任务栏右边托盘图标+时间区 HWND hTrayNotifyWnd = FindWindowEx(hShellTrayWnd,0,L"TrayNotifyWnd",NULL); //不同系统可能有可能没有这层 HWND hSysPager = FindWindowEx(hTrayNotifyWnd,0,L"SysPager",NULL); //托盘图标窗口 HWND hToolbarWindow32; if (hSysPager) { hToolbarWindow32 = FindWindowEx(hSysPager,0,L"ToolbarWindow32",NULL); }else {hToolbarWindow32 = FindWindowEx(hTrayNotifyWnd,0,L"ToolbarWindow32",NULL); } if (hToolbarWindow32) {RECT r; GetWindowRect(hToolbarWindow32,&r); int width = r.right - r.left; int height = r.bottom - r.top; //从任务栏中间从左到右 MOUSEMOVE一遍,所有图标状态会被更新for (int x = 1; x<width; x++){ SendMessage(hToolbarWindow32,WM_MOUSEMOVE,0,MAKELPARAM(x,height/2)); } } }
#endiftestTrayIcon::testTrayIcon(QWidget *parent, Qt::WFlags flags): QMainWindow(parent, flags)
{ui.setupUi(this);QIcon icon = QIcon( ":/logo.png" );QSystemTrayIcon *trayIcon = new QSystemTrayIcon( this );trayIcon->setIcon(icon);trayIcon->setToolTip(tr( "hello" ));QString titlec=tr( "hello" );QString textc=tr( "hello" );trayIcon->show();trayIcon->showMessage(titlec,textc,QSystemTrayIcon::Information,5000);QMenu*pMenu=new QMenu(this);pMenu->addAction("test1");pMenu->addAction("test2");trayIcon->setContextMenu(pMenu);RefreshIcon();
}testTrayIcon::~testTrayIcon()
{}
Windows下QT实现托盘程序及系统托盘刷新相关推荐
- Windows下QT设置应用程序(exe)图标、任务栏托盘图标、任务栏窗口图标
1. 设置应用程序(exe)图标 在Qt助手(QT Assistant)中,输入"setting",可以看到下面的列表中有Setting the Application Icon, ...
- Windows下Qt程序打包
Windows下Qt程序打包 将windeployqt.exe 目录添加到系统环境变量 windeployqt.exe目录如下: 命令行打包 1.打开命令行 2.执行打包命令 windeployqt ...
- qt程序在Linux下字体乱了,解决linux/Ubuntu下Qt creater 界面程序在编译运行后无法显示中文或中文乱码问题!...
本文解决的主要是界面程序编译运行后无法显示中文的问题,如果在creater 中无法输入中文,下载个IBus或者搜狗之类的中文输入法即可解决! 首先说乱码问题,这个很好解决: 如果是在linux下打开W ...
- Windows下Qt Creator设置IDE菜单字体样式
Windows下Qt Creator设置IDE菜单字体样式 本文为解决以下问题: IDE的菜单字体太小 IDE的菜单字体样式,可以更换为微软雅黑 创建样式文件 在Qt Creator目录下C:\Qt\ ...
- 关于linux下网络服务器和windows下Qt客户端的通信(图片文件显示)
关于最近比较火的物联网视频监控项目,在这里给大家分享下图片传输这一块,首先客户端显示是在Windows下Qt中,服务器是在linux系统ubuntu中,服务端打开本地两张图片循环发送给客户端Qt进行显 ...
- c语言与qt编写安卓,Windows下Qt for Android 编译安卓C语言可执行程序
作为 C/C++ 程序员,有时候我们希望在安卓上运行从 C/C++ 生成的可执行程序,而不是在 Java 中通过 jni 的方式来调用 C 动态库.有两个途径可以达到这个目的:一 作为 C/C++ 程 ...
- linux32位运行64位程序,32位windows下可以运行的程序在64位linux下报错
已结贴√ 问题点数:20 回复次数:3 32位windows下可以运行的程序在64位linux下报错 filt.c在32位windows code:blocks 10.05下运行无任何异样. 传到64 ...
- 实现Windows下Qt扫描U盘的两种方式
参考网上资源,总结了如下实现Windows下Qt扫描U盘的两种方式:. 方式1: 检测Windows的事件–WM_DEVICECHANGE 缺点:想要检测时,必须发生过一次U盘插拔动作,需要手动&qu ...
- Windows下如何快速查看并导出系统详细信息(计算机名、操作系统、系统制造商、系统型号、BIOS、CPU及内存大小)
Windows下如何快速查看并导出系统详细信息 使用dxdiag 正文 Win + R键打开命令行 输入dxdiag回车,就可以看到如下系统信息. 通过下一页按钮可以查看显卡.声卡及输入输出设备及驱动 ...
最新文章
- C#中方法参数的四种类型
- Android 改变窗口标题栏的布局
- 全国计算机二级qq闪退,电脑上QQ闪退怎么回事?各个系统版本电脑QQ闪退现象的解决方法介绍...
- Redhat中设置环境变量PATH
- 【转】jquery 注册事件的方法
- java mongodb 使用场景_mongodb使用场景一般是什么?mongodb有哪些基本命令?
- apache axis 1.4的invoke方法设置超时_Kubernetes 网络故障常见排查方法
- 中油C语言第一次在线作业,中石油华东《程序设计(C语言)》2020年春季学期在线作业(二)...
- Windows 平台安装 MongoDB
- Entity FrameWork利用Database.SqlQueryT执行存储过程并返回参数
- SPOJ LIS2 Another Longest Increasing Subsequence Problem 三维偏序最长链 CDQ分治
- 设置自增递增零开始_SnowflakeId雪花ID算法,分布式自增ID应用
- 朴素版prim算法求最小生成树
- Atitit 摄像头与主机连接方式大总结
- paip.c++ 正则表达式的应用跟普通正则表达式的区别以及特别注意点总
- 语言(文化)代码与国家地区对照表
- imagecopyresampled要生成彩色却生成了灰色图片
- 可测函数积分的进一步性质
- php导航自助收录源码,最近网上流行的导航网秒收录网站php源码
- 如何做一个根据自己的需求做一个完美的商品详情页?