Windows操作系统中的某些程序运行时不显示运行窗口,只在任务栏上显示一个图标,表示程序正在运行,用户可以通过鼠标与应用程序交互,比如金山毒霸等应用程序,我们有时也需要编制一些仅在后台运行的类似程序,为了不干扰前台程序的运行界面和不显示不必要的窗口,应使程序运行时的主窗口不可见。同时将一个图标显示在任务栏右端静态通告区中并响应用户的鼠标动作。下面介绍Visual C++开发这类程序的设计方法。 i9\Pks#l%
8=$@azG
一、隐藏程序的主窗口 =(o$1v/k
5d)G30
首先,要使程序的主窗口不可见,并且不在任务栏上出现任务按钮,要做到这两点,需分别设置主边框窗口的风格和扩展风格: MRs8l
5<u+2x8|
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) e}kG1C8
{ 6>l-jTM
cs.style =WS_POPUP;//使主窗口不可见 ),n?"
cs.dwExStyle |=WS_EX_TOOLWINDOW;//不显示任务按钮 Yy&0b(m U
return CFrameWnd::PreCreateWindow(cs); 2$jY_{B+x
} ukN#>e+L1
<1"6`24
二、将表示程序运行的图标加入任务栏 dM
QnN[d6
4m~\S)ad
在主框架窗口的CMainFrame::OnCreate()函数中调用上述函数,就可以在任务条上显示图标这一步是利用系统API函数Shell_NotifyIcon()将一个图标显示在任务栏的通告区中。该函数的原型为:在调用该函数之前,需要确定其参数的取值。其中Shell_NotifyIcon()函数的第一个参数是一个预定义的消息,可以取如下值之一:NIM_ADD、NIM_DELETE或NIM_MODIFY,分别表示添加图标、删除图标或修改图标。另一个参数为指向NOTIFYICONDATA类型的指针。其原型为: Axr'zc
7Kn=[2J5k'
typedef struct _NOTIFYICONDATA { 6A%Y/oU+2
DWORD cbSize; E*kS{2NAq
HWND hWnd; ]xuq2MU,l
UINT uID; 9Y7 tI3
UINT uFlags; -V9Cx_]y
UINT uCallbackMessage; v^e[`]u(
HICON hIcon; fx*Swv%r
charszTip[64]; } Z*JZUbo-Q
NOTIFYICONDATA /q]WV^H
$jm'uDvm
在该结构的成员中,cbSize为该结构所占的字节数,hWnd为接受该图标所发出的消息的窗口的句柄(鼠标在任务栏上程序图标上动作时图标将发出消息,这个消息用户要自己定义),uID为被显示图标的ID,uFlags指明其余的几个成员(hIcon、uCallBackMessage和szTip)的值是否有效,uCallbackMessage为一个用户自定义的消息,当用户在该图标上作用一些鼠标动作时,图标将向应用程序的主框架窗口(hWnd成员中指定的窗口)发出该消息,。hIcon为将在任务栏上被显示图标的句柄,szTip鼠标停留在该图标上时显示的字符串。 A/'G.H
1@/+ c
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) bo]k9FC
{ LnBkd:>}
NOTIFYICONDATA tnd; 4kx#=MLt
tnd.cbSize=sizeof(NOTIFYICONDATA); 1j}o.0\
tnd.hWnd=this->m_hWnd; *?c~7ru
tnd.uID=IDR_MAINFRAME;
BYu|loc
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP; YyI|^f8C
tnd.uCallbackMessage=WM_MYMESSAGE; BKN]DxJ6
file://用户自定义的消息,即鼠标在任务栏上程序图标上动作时图标发送的消息 %bddR;c
tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); &v