文章详情
C++添加托盘弹窗,图标,以及图标闪动示例
Posted on 2019-02-16 20:48:35 by 主打一个C++
//vs控制台测试代码,直接跑
#include <windows.h>
#include <shellapi.h>
#include <tchar.h>
#pragma warning(disable: 4996)
#define ID_TRAY_APP_ICON 1
#define IDT_TIMER1 101
#define ID_EXIT WM_USER + 1
HINSTANCE g_hInst = NULL;
NOTIFYICONDATA nid;
HMENU hMenu = NULL;
void AddTrayIcon(HWND hWnd);
void RemoveTrayIcon();
void ShowBalloonTip(HWND hWnd, LPCTSTR szTipTitle, LPCTSTR szTipText);
void ToggleTrayIcon();
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int main() {
//g_hInst = GetModuleHandle(NULL);
// 创建窗口类
const TCHAR CLASS_NAME[] = _T("TrayIconApp");
WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
wcex.lpfnWndProc = WindowProc;
wcex.hInstance = GetModuleHandle(NULL);
wcex.lpszClassName = CLASS_NAME;
RegisterClassEx(&wcex);
// 创建窗口
HWND hWnd = CreateWindowEx(
0, CLASS_NAME, _T("Tray Icon Application"), WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, wcex.hInstance, NULL
);
// 显示窗口
ShowWindow(hWnd, SW_HIDE);
// 添加托盘图标
AddTrayIcon(hWnd);
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// 移除托盘图标
RemoveTrayIcon();
return (int)msg.wParam;
}
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_CREATE: {
// 设置定时器
SetTimer(hWnd, IDT_TIMER1, 600, NULL);
// 创建菜单
hMenu = CreatePopupMenu();
AppendMenu(hMenu, MF_STRING, ID_EXIT, _T("退出"));
}
break;
case WM_TIMER: {
// 检查定时器ID
if (wParam == IDT_TIMER1) {
// 切换托盘图标显示状态
ToggleTrayIcon();
}
}
break;
case WM_DESTROY:
KillTimer(hWnd, IDT_TIMER1);
PostQuitMessage(0);
RemoveTrayIcon();
return 0;
case WM_CONTEXTMENU:
if (lParam == 0) {
POINT pt;
GetCursorPos(&pt);
SetForegroundWindow(hWnd);
TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hWnd, NULL);
PostMessage(hWnd, WM_NULL, 0, 0);
}
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case ID_EXIT:
PostMessage(hWnd, WM_DESTROY, 0, 0);
break;
}
break;
case WM_USER + 1:
switch (LOWORD(lParam)) {
case WM_RBUTTONDOWN:
PostMessage(hWnd, WM_CONTEXTMENU, NULL, 0);
break;
}
break;
}
return DefWindowProc(hWnd, message, wParam, lParam);
}
void AddTrayIcon(HWND hWnd) {
nid.cbSize = sizeof(nid);
nid.hWnd = hWnd;
nid.uID = ID_TRAY_APP_ICON;
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
nid.uCallbackMessage = WM_USER + 1;
nid.hIcon = LoadIcon(g_hInst, IDI_APPLICATION);
_tcscpy(nid.szTip, _T("托盘图标示例"));
Shell_NotifyIcon(NIM_ADD, &nid);
ShowBalloonTip(hWnd, _T("提示"), _T("托盘图标已添加"));
}
void RemoveTrayIcon() {
Shell_NotifyIcon(NIM_DELETE, &nid);
}
void ShowBalloonTip(HWND hWnd, LPCTSTR szTipTitle, LPCTSTR szTipText) {
nid.uFlags = NIF_INFO;
nid.uTimeout = 10000;
_tcscpy(nid.szInfoTitle, szTipTitle);
_tcscpy(nid.szInfo, szTipText);
Shell_NotifyIcon(NIM_MODIFY, &nid);
}
void ToggleTrayIcon() {
nid.uFlags = NIF_ICON;
if (nid.hIcon == LoadIcon(g_hInst, IDI_APPLICATION)) {
nid.hIcon = LoadIcon(g_hInst, IDI_HAND);
}
else {
nid.hIcon = LoadIcon(g_hInst, IDI_APPLICATION);
}
Shell_NotifyIcon(NIM_MODIFY, &nid);
}
*转载请注明出处:原文链接:https://cpp.vin/page/141.html