没有使用MFC的程序,使用Shell_NotifyIcon添加的系统图标,
自己写了一个APP的类用来初始化程序,创建窗口,同时也创建系统图标,
在程序退出的时候需要手动删除才行,但是不管我APP类的析构函数中删除,还是在WM_CLOSE或者WM_DESTROY里面删除它都不行,每次退出程序的时候,图标都不能正常删除,
自己写了一个APP的类用来初始化程序,创建窗口,同时也创建系统图标,
在程序退出的时候需要手动删除才行,但是不管我APP类的析构函数中删除,还是在WM_CLOSE或者WM_DESTROY里面删除它都不行,每次退出程序的时候,图标都不能正常删除,
{
NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(NOTIFYICONDATA));
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd; //hWnd为主窗口,
nid.uID = NOTIFYICON_ID;
Shell_NotifyIcon(NIM_DELETE, &nid); return 1;
}然后在消息回调中:
HUApp* mainapp = (HUApp*)AfxGetMainApp();
case WM_CLOSE:
{
mainapp->Release();
DestroyWindow( hWnd);
} break;还有个问题,我在做了点右键时弹出一个菜单,但是只有在当前窗口没有激活的时候才有效,不然第一次点右键会取消窗口的激活状态,再点一次才弹出菜单.
void CMyDlg::OnDestroy()
{
CDialog::OnDestroy();
//程序退出,从托盘区删除图标
NOTIFYICONDATA nc;
nc.cbSize = sizeof(NOTIFYICONDATA);
nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
nc.hWnd = m_hWnd;
nc.uCallbackMessage = WM_NOTIFYICON;
nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nc.uID = IDC_NOTIFYICON;
Shell_NotifyIcon(NIM_DELETE, &nc);
}
void CMainFrame::OnDestroy()
{
CMDIFrameWnd::OnDestroy();
::Shell_NotifyIcon(NIM_DELETE,&tnd);//程序退出时图标消失
// TODO: Add your message handler code here
}
没看到代码不好评说,我认为楼主的处理方式有问题,建议如下:
从网上搜索一下"VC托盘图标"相关的文章,有详尽的操作步骤,基本上都非常简单,而且思路清晰.你按上面的步骤处理,没有不成功的.这是最简单的方法,比你找问题快捷多了.
__________________________________________________________________________我并不是做工程,其实我已经用MFC做成功了系统栏图标,只不过想看看只用win32和shell自己手动做而已,要有钻研才会有提高嘛.
在图标删除的时候不用像创建图标时一样定义这么多,只要指定窗口和Uid就可以了,你把你代码中:
nc.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
nc.uCallbackMessage = WM_NOTIFYICON;
nc.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
这三句去掉,保留下面几句就可以了.参照MSDN有详细说明.
nc.cbSize = sizeof(NOTIFYICONDATA);
nc.hWnd = m_hWnd;
nc.uID = IDC_NOTIFYICON;
Shell_NotifyIcon(NIM_DELETE, &nc);
thankyou!
互相学习!
// Returns TRUE if successful, or FALSE otherwise.
// hwnd - handle to the window that added the icon.
// uID - identifier of the icon to delete. BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID)
{
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = uID;
res = Shell_NotifyIcon(NIM_DELETE, &tnid);
return res;
}