zoukankan      html  css  js  c++  java
  • 程序隐藏到任务栏的实现

    我们在使用软件的时候,有的软件允许最小化到任务栏,然后双击任务栏的图标时又会显示出来,这篇文章主要说明如何实现这种功能;
    实现这种功能主要分为两步,一是将程序窗口隐藏,二是将程序图标添加到任务栏,再次显示也是分为两步:第一步是将任务栏上的图标删除,第二步是将窗口显示出来。窗口的隐藏与显示我们用API函数ShowWindow,而添加和删除任务栏中的程序图标用的是Shell_NotifyIcon函数,ShowWindow函数平时用的比较多,而且也比较简单,这里就不在阐述,下面主要说明Shell_NotifyIcon的用法:

    BOOL Shell_NotifyIcon(          
        DWORD dwMessage,
        PNOTIFYICONDATA lpdata
    );
    

    该函数有两个参数,第一个表示你希望对图标做何种操作主要有这几个值:NIM_ADD、NIM_DELETE、NIM_MODIFY、NIM_SETFOCUS、NIM_SETVERSION;常用的是前面3个主要是向任务栏添加图标、删除图标、修改图标;
    第二个参数是一个结构体该结构体的定义如下:

    typedef struct _NOTIFYICONDATA { 
      DWORD cbSize;//该结构的大小
      HWND hWnd; //表明当对任务栏图标进行操作是将消息发送给那个窗口
      UINT uID; //应用程序的ID
      UINT uFlags; //一个标志
      UINT uCallbackMessage;//对任务栏图标操作时向窗口发送的一个消息 
      HICON hIcon; //放到任务栏中的图标句柄
      WCHAR szTip[64]; //当鼠标停在图标上时显示的提示信息
    } NOTIFYICONDATA, *PNOTIFYICONDATA;

    UINT uID 参数是应用程序的ID,这个ID并不是必须的可以任意给值
    UINT uFlags 参数是一个标志,主要用于控制图标的行为:
    NIF_ICON:有这个标志hIcon才是有效值
    NIF_MESSAGE:有这个标志uCallbackMessage才有效,也就是说有这个标志,当我们进行操作时才有消息产生
    NIF_TIP:当有这个标志时szTip,才有效,才会出现提示信息;
    UINT uCallbackMessage:当我们对任务栏图标进行操作时会发送一条消息这个消息由用户自己定义,并且在窗口过程中处理。

    函数介绍完了,接下来就是实现的代码:

    //这里是将移出图标与添加图标放到一个函数中,根据第二个参数判断是需要移出或是添加
    BOOL TrackIcon(HWND hWnd, BOOL bTrak)
    {
        NOTIFYICONDATA nid = {0};
        nid.cbSize = sizeof(NOTIFYICONDATA);
        nid.hWnd = hWnd;
        nid.uID = 0;
        if (bTrak)
        {
            nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
            nid.uCallbackMessage = WM_TRAKICON_MSG;
            nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
            _tcscpy_s(nid.szTip, sizeof(nid.szTip), _T("提示信息"));
    
            ShowWindow(hWnd, SW_MINIMIZE);
            ShowWindow(hWnd, SW_HIDE);
            return Shell_NotifyIcon(NIM_ADD, &nid);
        }else
        {
        //当需要移出图标时,窗口也应该完全显示,因此不需要对图标操作,后面的几个值就是无效值,这里可以不用管它们
            ShowWindow(hWnd, SW_SHOWNA);
            return Shell_NotifyIcon(NIM_DELETE, &nid);
        }
    
    }
    //这是对我们自定义的消息进行处理,这个消息中的lParam保存了相应的消息ID
    case WM_TRAKICON_MSG:
            {
                switch (lParam)
                {
                case WM_LBUTTONDBLCLK:
                    TrackIcon(hwndDlg,FALSE);
                    ShowWindow(hwndDlg,SW_SHOWNORMAL);
                    break;
                }
            }
            break;

    最后程序的运行结果如下:
    这里写图片描述

  • 相关阅读:
    摄影技巧:如何拍好夜景?这些拍摄要点值得借鉴
    单反摄影:快门优先怎么用?
    摄影基础知识:什么是光圈优先?
    【震惊】、【无耻】、【嚣张】浙江谷誉科技旗下爱卡之家,黑商圈钱跑路,强行黑吃,用户损失累计数亿
    爱卡之家是不是骗人的,爱卡之家跑路了吗?
    浙江谷誉网络的爱卡之家怎么样,是不是真实的,靠不靠谱?
    爱卡之家app怎么样?爱卡之家油卡套餐可信吗?爱卡之家是不是骗人的,靠不靠谱?
    爱卡之家充值不到账 爱卡之家疑似跑路 爱卡之家客服联系不上
    android TypedValue.applyDimension()的作用
    Android 在xml中配置 float 和 integer 值
  • 原文地址:https://www.cnblogs.com/lanuage/p/7725758.html
Copyright © 2011-2022 走看看