下面将对基于MFC和.NET Compact Framework2.0中如何使用托盘图标进行说明。
相关的API:Shell_NotifyIcon
BOOL WINAPI Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA lpData);
dwMessage:消息,有下面三种
Value
Description
NIM_ADD
Adds an icon to the status area.
NIM_DELETE
Deletes an icon from the status area.
NIM_MODIFY
Modifies an icon in the status area.
lpData:PNOTIFYICONDATA结构定义如下:
typedef struct _NOTIFYICONDATA { DWORD cbSize; HWND hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; HICON hIcon; WCHAR szTip[64]; } NOTIFYICONDATA, *PNOTIFYICONDATA;我们关心的往往只有hWnd:托盘图标的父窗口句柄,即应用程序窗口句柄
uFlags:指定哪些参数有效。
hIcon:图标句柄。
MFC添加托盘图标
1. 首先先导入一个图标文件,这里假设ID为IDI_ICON1
2. 添加一个自定义的消息,如下
#define WM_ICONNOTIFY (WM_USER + 101) //自定义消息
3. 为WM_ICONNOTIFY添加消息处理函数
ON_MESSAGE(WM_ICONNOTIFY, OnTrayNotification)
OnTrayNotification即用户点击托盘图标的消息响应函数,如果不需要弹出菜单的话,通常是将处于后台运行的程序显示出来。
LRESULT CTestDlg::OnTrayNotification(WPARAM uID, LPARAM lEvent)
{
if (WM_LBUTTONDOWN == lEvent)
{
ShowWindow(SW_NORMAL);
SetForegroundWindow();
}
return S_OK;
}
4. 在应用程序初始化的地方添加下面的代码。
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = m_hwnd;
nid.uID = 100;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nid.uCallbackMessage = WM_ICONNOTIFY;
nid.hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0);
wcscpy(nid.szTip, _T("test"));
Shell_NotifyIcon(NIM_ADD, &nid);
5. 应用程序在退出时,需要将托盘图标删除
Shell_NotifyIcon(NIM_DELETE, &m_nId);
.NET Compact Framework中添加托盘图标
由于.NET Compact Framework2.0还没有加入CNotifyIcon类,需要通过调用Shell_NotifyIcon来实现,如下:
1. 导入相关的win32的API
[DllImport("coredll.dll")]
internal static extern IntPtr GetModuleHandle(String lpModuleName);
[DllImport("coredll.dll")]
internal static extern IntPtr LoadIcon(IntPtr hInst, string IconName);
2. 添加托盘图标即消息响应函数
IntPtr hIcon = LoadIcon(GetModuleHandle(null), "#32512");
notifyIcon.Add(hIcon);
notifyIcon.Click += new EventHandler(notifyIcon_Click);
private void notifyIcon_Click(object sender, EventArgs e)
{
Show();
}
3. 重载Form close消息响应函数,点击右上角×隐藏窗口
private void Form1_Closed(object sender, EventArgs e)
{
Hide();
}
此时需要给应用添加一个图标,这样托盘图标才真正显示出来。