现在的位置: 首页 > 综合 > 正文

编写系统托盘程序

2014年02月02日 ⁄ 综合 ⁄ 共 1563字 ⁄ 字号 评论关闭
   系统托盘程序很常见,最常用的杀毒软件几乎全是这样的。平时在其他程序运行时为了不干扰其他前台程序运行并不显示没用的窗口,只是在任务栏上显示一个程序图标表示该程序正在后台运行。有时候我们也需要编写这样的程序。
  要完成这样的程序我们需要做一下3步:
  1、设置主边框窗口风格和扩展风格。
:PreCreateWindow(CREATESTRUCT& cs)
{
    // TODO: 在此添加专用代码和/或调用基类
    cs.style =WS_POPUP;//使主窗口不可见
    cs.dwExStyle |=WS_EX_TOOLWINDOW;//不显示任务按钮
    return CDialog::PreCreateWindow(cs);
}
  2、将表示程序运行的图标加入任务栏。在OnCreate()中调用BOOL Shell_NotifyIcon(  

    DWORD dwMessage,
    PNOTIFYICONDATA lpdata
);第一个参数是预定义消息,可以取NIM_ADD、NIM_DELETE、NIM_MODIFY等消息;第二个参数指向NOTIFYICONDATA
的指针。原形如下:
struct NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
TCHAR szTip[64];
DWORD dwState;
DWORD dwStateMask;
TCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
};
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
}

添加如下代码
int CXXXDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: 在此添加您专用的创建代码
NOTIFYICONDATA tnd;
tnd.cbSize=sizeof(NOTIFYICONDATA);
tnd.hWnd=this->m_hWnd;
tnd.uID=IDR_MAINFRAME;
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.uCallbackMessage=WM_MYMESSAGE;
tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(tnd.szTip,"个人工具");//图标提示为"个人工具"
Shell_NotifyIcon(NIM_ADD,&tnd);//向任务栏添加图标

return 0;
}
3、与用户交互:其中WM_MYMESSAGE是个人自定义的消息,用来处理用户交互操作消息的。如鼠标在图标上双击、
右键单击等操作。
switch(message)
{
case WM_MYMESSAGE:
{
UINT uID;//发出该消息的图标的ID
UINT uMouseMsg;//鼠标动作
POINT pt;
uID=(UINT) wParam;
uMouseMsg=(UINT) lParam;

if (uMouseMsg == WM_RBUTTONDOWN)
{
}
else if (uMouseMsg == WM_LBUTTONDBLCLK)
{
}
}
break;
default:
break;
}
  完成了以上三步基本上托盘程序已经写完了,当然关于怎么响应左右键操作,显示、隐藏窗口,
弹出右键菜单等是另外一回事了。如果有时间在下一篇再写吧。

抱歉!评论已关闭.