关于自启动服务程序的托盘图标问题

GaA_Ra 2011-11-04 09:34:10
Windows启动的时候顺序是SCM的Services.exe进程先于explorer.exe启动,我觉得两者进程是同步进行的
这里带来的问题就是,如果我的一个自启动的程序(比如说360),我在系统托盘处是有图标的,如果explorer.exe未启动,那么设置系统托盘图标的调用是无效的(简单测试过,手动关explorer.exe然后写个程序调用一下,结果重新启动explorer.exe没有看到托盘图标),那这里要怎么让我的自启动进程的图标出现?
获取explorer.exe启动结束的消息,然后再继续?

扩展思路问题:360的开机助手是如何获得开机时间的?
...全文
245 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
GaA_Ra 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 oyljerry 的回复:]

引用 5 楼 gaa_ra 的回复:
引用 3 楼 oyljerry 的回复:

开机助手可以GetTickCount获取开机以来的时间。然后在它的应用程序启动的时候显示


哥们,这个计算时间的方法如果你能保证自己的应用程序是系统启动完成前的最后一个程序启动,那么这种方法才是精确的,带来的问题是,如何保证自己的这个计时进程是最后一个启动^_^

没必要是最后一个,这类程序本身就……
[/Quote]

好吧,私以为一个好的开机时间应该是要精确一点的..
GaA_Ra 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 happyparrot 的回复:]

个人认为应该可以。我不知道explorer.exe的启动是否比网络,数据库服务,显卡等启动的更早,但可以看到托盘中的这些图标都是有的
[/Quote]
好的,懂了.
我之前还以为要在服务里面判断explorer.exe是否启动之后再调用Shell_NotifyIcon(),学习了~^_^
oyljerry 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gaa_ra 的回复:]
引用 3 楼 oyljerry 的回复:

开机助手可以GetTickCount获取开机以来的时间。然后在它的应用程序启动的时候显示


哥们,这个计算时间的方法如果你能保证自己的应用程序是系统启动完成前的最后一个程序启动,那么这种方法才是精确的,带来的问题是,如何保证自己的这个计时进程是最后一个启动^_^
[/Quote]
没必要是最后一个,这类程序本身就是一个近似的时间,它只要显示自己启动的时候,开机时间多少.
快乐鹦鹉 2011-11-04
  • 打赏
  • 举报
回复
个人认为应该可以。我不知道explorer.exe的启动是否比网络,数据库服务,显卡等启动的更早,但可以看到托盘中的这些图标都是有的
GaA_Ra 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]

开机助手可以GetTickCount获取开机以来的时间。然后在它的应用程序启动的时候显示
[/Quote]

哥们,这个计算时间的方法如果你能保证自己的应用程序是系统启动完成前的最后一个程序启动,那么这种方法才是精确的,带来的问题是,如何保证自己的这个计时进程是最后一个启动^_^
GaA_Ra 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 happyparrot 的回复:]

这个问题不难。杀掉桌面进程后,你再重启该进程,如果需要让你得服务程序的托盘图标再出现,你需要在你得程序中进行托盘消息注册,这样,当桌面进程重启后,托盘会向注册的所有系统发送消息,这样就可以恢复图标了。方法如下:
在主窗口中注册消息:
const UINT WM_TASKBARCREATED =
::RegisterWindowMessage(_T("TaskbarCreated"……
[/Quote]
谢谢哥们
我的后续问题是:如果不是杀掉explorer.exe的场景,是我一个自启动的服务(假设创建test.exe),在这个test.exe被SCM启动的时候,explorer.exe还没有启动,这个时候注册WM_TASKBARCREATED仍然能够获得通知么?
oyljerry 2011-11-04
  • 打赏
  • 举报
回复
开机助手可以GetTickCount获取开机以来的时间。然后在它的应用程序启动的时候显示
快乐鹦鹉 2011-11-04
  • 打赏
  • 举报
回复
这个问题不难。杀掉桌面进程后,你再重启该进程,如果需要让你得服务程序的托盘图标再出现,你需要在你得程序中进行托盘消息注册,这样,当桌面进程重启后,托盘会向注册的所有系统发送消息,这样就可以恢复图标了。方法如下:
在主窗口中注册消息:
const UINT WM_TASKBARCREATED =
::RegisterWindowMessage(_T("TaskbarCreated"));
增加消息响应函数:
头文件:
afx_msg LRESULT OnTaskBarCreated(WPARAM wParam,LPARAM lParam);
CPP:
ON_REGISTERED_MESSAGE(WM_TASKBARCREATED, OnTaskBarCreated)

//响应任务栏重新创建消息,当桌面进行被杀,重新启动后会执行
LRESULT CMailParseDlg::OnTaskBarCreated(WPARAM wParam,LPARAM lParam)
{
NOTIFYICONDATA nid;
nid.cbSize=sizeof(NOTIFYICONDATA);
nid.hWnd=AfxGetMainWnd()->m_hWnd;
nid.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
nid.uCallbackMessage=WM_SHOWTASK;
strcpy(nid.szTip,"报文处理系统");
nid.uID=IDD_MAILPARSE_DIALOG;
nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
::Shell_NotifyIcon(NIM_ADD,&nid);
return TRUE;
}
smwhotjay 2011-11-04
  • 打赏
  • 举报
回复
很常见. 做法应该是去获得所有托盘信息.如果没有.就添加自己的.

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧