★★★能够实现系统托盘功能的Atl服务器★★★

时间:2021-01-26 17:10:29
那位XD试过能够实现系统托盘的Atl服务器
要求运行后在系统托盘区显示图标,并且支持系统托盘的基本功能(例如浮动提示、鼠标右键弹出浮动菜单等)

16 个解决方案

#1


系统托盘和Atl服务器好像没有必然的关系吧,你到网上找找很多托盘的源吗

www.vckbase.com
www.vchelp.com

#2


我手头已经找到了许多,做了一个atl的com服务器试验程序,但是没有通过,任务恰好又特别紧(需要赶在节前),所以想找一个现成的框架。

#3


不太明白,帮顶混分分

#4


在下完成了一个,但是其中有一点不大明白的地方。

  Atl编写的Com服务器,在自定义的Init方法中创建了一个非模态对话框作为主界面(可以隐藏和显示),同时创建系统托盘,从托盘右键弹出菜单可以另创建一个OverlappedWindow。

  这就会存在一种可能,当客户端调用自定义的Quit方法通知服务端退出时,窗口正处于打开状态,于是我在Quit方法中加入了DestroyWindow关闭该窗口。

  这时就有一个奇怪的现象,如果主界面对话框和窗口都处于显示/打开状态时,服务器能够正常退出,但是如果主界面对话框处于隐藏状态,而窗口处于打开状态时,服务器就会成功关闭窗口,清除托盘,但却驻留在内存里,没有任何错误提示,客户端变为不可响应。单步调试跟踪到CServiceModule::Run()中的CoUninitialize(),执行完Unlock()后死机。

  目前只好在Quit中DestroyWindow前先调用ShowWindow使主界面对话框显示,经过测试一切正常。令在下百思不得其解,望知道者教我,谢谢。

#5


不懂,不过有以下疑问
1、"从托盘右键弹出菜单可以另创建一个OverlappedWindow"
为什么要另创建一个窗口呢?
2、为什么要创建一个非模态对话框呢?
可以创建一个窗口代替,试试。

#6


呵呵,这是在下的任务需要啊。

我的这个Atl DCom服务器被调用后,显示主界面对话框,用户可以选择保留或者关闭(其实是隐藏),通过左键双击可以重新打开(其实是显示),而右键菜单提供打开主界面、历史记录查询(窗口)、设置对话框等功能。

#7


隐藏状态下DestroyWindow会挂起...会不会是非模对话框的消息汞得不到退出通知所以死循环?

不如试试用其它退出方式代替DestroyWindow,例如OnOK(),通知非模态消息汞退出循环。

#8


但是如果不打开OverlappedWindow,那么即使非模对话框处于隐藏状态,也能正常退出,似乎是本该送往隐藏状态下的非模对话框的关闭消息被打开的窗口拦截了,而窗口当时又被destory了,所以...

#9


i cann't help you:)

#10


你自己先做一个exe托盘试一下,应该没有区别

#11


sm意思?

#12


我是刚入门的新手,你们说什么能说的清楚一些吗?
我想好好学学这方面的东西

#13


在ShowWindow时调用MoveWindow,用户就看不出来窗口显示了

#14


能否看出窗口显示无所谓啊,问题是为什么需要showwindow一下才行?

#15


谁知道啊?

#16


自己顶 ^_^

#1


系统托盘和Atl服务器好像没有必然的关系吧,你到网上找找很多托盘的源吗

www.vckbase.com
www.vchelp.com

#2


我手头已经找到了许多,做了一个atl的com服务器试验程序,但是没有通过,任务恰好又特别紧(需要赶在节前),所以想找一个现成的框架。

#3


不太明白,帮顶混分分

#4


在下完成了一个,但是其中有一点不大明白的地方。

  Atl编写的Com服务器,在自定义的Init方法中创建了一个非模态对话框作为主界面(可以隐藏和显示),同时创建系统托盘,从托盘右键弹出菜单可以另创建一个OverlappedWindow。

  这就会存在一种可能,当客户端调用自定义的Quit方法通知服务端退出时,窗口正处于打开状态,于是我在Quit方法中加入了DestroyWindow关闭该窗口。

  这时就有一个奇怪的现象,如果主界面对话框和窗口都处于显示/打开状态时,服务器能够正常退出,但是如果主界面对话框处于隐藏状态,而窗口处于打开状态时,服务器就会成功关闭窗口,清除托盘,但却驻留在内存里,没有任何错误提示,客户端变为不可响应。单步调试跟踪到CServiceModule::Run()中的CoUninitialize(),执行完Unlock()后死机。

  目前只好在Quit中DestroyWindow前先调用ShowWindow使主界面对话框显示,经过测试一切正常。令在下百思不得其解,望知道者教我,谢谢。

#5


不懂,不过有以下疑问
1、"从托盘右键弹出菜单可以另创建一个OverlappedWindow"
为什么要另创建一个窗口呢?
2、为什么要创建一个非模态对话框呢?
可以创建一个窗口代替,试试。

#6


呵呵,这是在下的任务需要啊。

我的这个Atl DCom服务器被调用后,显示主界面对话框,用户可以选择保留或者关闭(其实是隐藏),通过左键双击可以重新打开(其实是显示),而右键菜单提供打开主界面、历史记录查询(窗口)、设置对话框等功能。

#7


隐藏状态下DestroyWindow会挂起...会不会是非模对话框的消息汞得不到退出通知所以死循环?

不如试试用其它退出方式代替DestroyWindow,例如OnOK(),通知非模态消息汞退出循环。

#8


但是如果不打开OverlappedWindow,那么即使非模对话框处于隐藏状态,也能正常退出,似乎是本该送往隐藏状态下的非模对话框的关闭消息被打开的窗口拦截了,而窗口当时又被destory了,所以...

#9


i cann't help you:)

#10


你自己先做一个exe托盘试一下,应该没有区别

#11


sm意思?

#12


我是刚入门的新手,你们说什么能说的清楚一些吗?
我想好好学学这方面的东西

#13


在ShowWindow时调用MoveWindow,用户就看不出来窗口显示了

#14


能否看出窗口显示无所谓啊,问题是为什么需要showwindow一下才行?

#15


谁知道啊?

#16


自己顶 ^_^