L o a d i n g . . .
主打一个C++
文章详情

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

作者近期文章
提示
×
确定
数据库执行: 7次 总耗时: 0.01s
页面加载耗时: 



wechat +447752296473
wechat cpp-blog