制作的主要涉及到的API只有Shell_NotifyIcon
虽然API只有一个,但是这个API的参数的数据结构可是看的让人很烦的。
NOTIFYICONDATA
typedef struct _NOTIFYICONDATA {
DWORD cbSize; //结构大小 byte计算
HWND hWnd; //创建托盘的程序窗口句柄,也就是应用程序窗口句柄
UINT uID; //图标ID
UINT uFlags;
UINT uCallbackMessage; //自定义回调消息,当你的鼠标位于托盘上的时候,鼠标和键盘有任何消息的时候都会触发这个消息/ 其中lParam指定消息ID,
HICON hIcon;
TCHAR szTip[64]; //当鼠标放在托盘上的时候显示的文字
DWORD dwState;
DWORD dwStateMask;
TCHAR szInfo[256];//以一个向tip窗口形式显示的文字
union {
UINT uTimeout;
UINT uVersion;
};
TCHAR szInfoTitle[64]; //TIP窗口标题
DWORD dwInfoFlags;
GUID guidItem;
} NOTIFYICONDATA, *PNOTIFYICONDATA;
定义一个成员变量用于存放NOTIFYICONDATA结构,然后在OnInitDialog里面创建托盘,在Onclose里面删除托盘图标,添加自定义消息来处理鼠标在托盘上的单击消息。在消息中ShowWindow(SW_SHOW)
代码如下:
OnInitDialog
m_nid.cbSize = sizeof(m_nid);
m_nid.hWnd = this->m_hWnd;
m_nid.hIcon = AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_ICON1));
//wcscpy_s(m_nid.szInfoTitle,20,TEXT("WarKey"));
m_nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_INFO | NIF_TIP;
wcscpy(m_nid.szTip,TEXT("jasonM WarKey"));
wcscpy_s(m_nid.szInfoTitle,5,TEXT("提示"));
m_nid.uCallbackMessage = WM_MYSHOWWINDOW;
m_nid.uTimeout = 10;
wcscpy_s(m_nid.szInfo,100,TEXT("JasonM制作"));
m_nid.dwInfoFlags = NIIF_INFO;
::Shell_NotifyIcon(NIM_ADD, &m_nid);
OnClose
void CMyWarKeyDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
Shell_NotifyIcon(NIM_DELETE,&m_nid);
CDialog::OnClose();
}
处理自定义消息:
afx_msg LRESULT CMyWarKeyDlg::OnShowMyWindow(WPARAM wParam, LPARAM lParam)
{
if(lParam == WM_LBUTTONDOWN)
{
ShowWindow(SW_SHOW);
}
return 1;
}