您的位置:首页 > 其它

程序最小化到系统托盘

2006-08-16 21:29 246 查看
使用Shell_NotifyIcon(DWORD dwMessage, PNOTIFYICONDATA lpdata)函数。在此之前需要建立PNOTIFYICONDATA结构体。
MSDN中PNOTIFYICONDATA结构体如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
#if (_WIN32_IE < 0x0500)
TCHAR szTip[64];
#else
TCHAR szTip[128];
#endif
#if (_WIN32_IE >= 0x0500)
DWORD dwState;
DWORD dwStateMask;
TCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
} DUMMYUNIONNAME;
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
#endif
#if (_WIN32_IE >= 0x600)
GUID guidItem;
#endif
} NOTIFYICONDATA, *PNOTIFYICONDATA;
我们需要定义这几个参数:
cbSize = sizeof(NOTIFYICONDATA);//结构体大小
tnd.hWnd = this->m_hWnd;//接收发送出消息的窗口的句柄
tnd.uID = IDR_MAINFRAME;//最小化后显示在托盘的图标的ID
tnd.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;//指示结构体中有效的成员
tnd.uCallbackMessage = UM_TRAY;//程序自定义的消息,当鼠标移动、单击、双击
或是其他鼠标事件发生在托盘程序上时,所发送的消息
tnd.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));//所加入图标的句柄
strcpy(tnd.szTip,"我的托盘程序");//鼠标移到我们的托盘程序上时现实的文字

看了以上文字,大家可能对托盘程序的原理有些蒙,那我就简单地讲讲吧。
当调用Shell_NotifyIcon时,程序向右下角发出了一个消息,这个消息在函数中第一个参数有定义,可以是加入(NIM_ADD)等。设定的NOTIFYICONDATA结构体,指定了显示在托盘的程序图标、当鼠标事件发生时,发送的一个UM_TRAY消息、接受这个消息的窗口句柄等内容。我们可以在程序中自己添加对UM_TRAY的相应,我是这样写的:
void CMyRingDlg::OnTray(WPARAM wParam,LPARAM lParam)
{
UINT uID;//发出该消息的图标的ID
UINT uMouseMsg;//鼠标动作
POINT pt;
uID = (UINT)wParam;
uMouseMsg = (UINT)lParam;
if(uMouseMsg == WM_LBUTTONDOWN)//如果是单击右键
{
switch(uID)
{
case IDR_MAINFRAME://如果是我们的图标
GetCursorPos(&pt);//取得鼠标位置
AfxGetApp()-> m_pMainWnd->ShowWindow(SW_SHOWNORMAL);//显示程序窗口
break;
default:
break;
}
}
return;
}
当然,在执行Shell_NotifyIcon后还需要隐藏我们的窗口,我们用AfxGetApp( )->m_pMainWnd->ShowWindow(SW_HIDE)来实现。

这样,就实现了我们把程序隐藏到托盘的要求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: