一个以服务启动的程序、但是开机后托盘没有显示?

play100 2007-11-29 11:38:27
如题,是一个与桌面相关的程序,并且是带托盘的,手工运行服务托盘正常显示,
但开机自动运行服务时,则时好时坏,请问是什么原因造成的,该怎么改?
...全文
260 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
teli_eurydice 2007-12-16
  • 打赏
  • 举报
回复
我也有这个疑问,但是没有解决,关注
wayne_raindot 2007-11-29
  • 打赏
  • 举报
回复
其原因是:后台服务程序的启动是优先于Explorer的。如果你的程序是先于Explorer启动,则看不到托盘图标,否则能看到。

解决方法:服务中至少创建一个顶层窗口(父窗口为NULL或者DESKTOP窗口),然后处理TaskbarCreated消息。在Explorer启动时会像所有顶层窗口广播TaskbarCreated消息。该消息为Explorer定义的注册消息,所以在使用先进行注册,代码如下。

UINT WM_TASKBARCREATED;

WM_TASKBARCREATED = RegisterWindowMessage(TEXT("TaskbarCreated"));
play100 2007-11-29
  • 打赏
  • 举报
回复
1.下面是服务的安装代码,按楼上所说,已经是和桌面相关联了(SERVICE_INTERACTIVE_PROCESS)<---是不是楼上说的在Explorer之后启动?
SC_HANDLE hService = ::CreateService(hSCM, m_szServiceName, m_szServiceName,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
szFilePath, NULL, NULL, _T("RPCSS\0"), NULL, NULL);

2.关于托盘好象没用到过楼上的代码,我是直接在CDialog的OnInitDialog中实现的,没做其它设置,以下是主要的原代码:
tnd.cbSize=sizeof(NOTIFYICONDATA);//CTaskbarNotifier m_taskbarDialog;
tnd.hWnd=this->m_hWnd;
tnd.uID=IDI_ICON_CLI;
tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON_CLI));
_tcscpy_s(tnd.szTip, 128, _T("客户端"));
tnd.uCallbackMessage=WM_MY_MESSAGE;
Shell_NotifyIcon(NIM_ADD,&tnd);

3.程序中除了主线程外,又开了两个,一个是显示界面的独立一个线程,另一个是客户端接收发送消息的线程。

好几天了还是有时开机会没托盘显示!!!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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