2010-07-13 113 views
0

我与Windows Server 2003(和2008)和C#工作,我有一个桌面系统托盘的问题。我做了一个磁盘管理应用程序,当应用程序启动时,它从任务栏隐藏自己并在系统托盘中添加一个图标。当我点击这个图标(在系统托盘中)时,会显示该应用程序的表单。在Windows服务器中的系统托盘图标的问题

我已经在系统调度程序中创建了一个任务,以在特定时间自动执行应用程序,如果我在应用程序午餐时(从调度程序)登录服务器,图标出现在系统的系统托盘中桌面。但是,如果我没有登录服务器和计划程序午餐我的应用程序,当我登录时,我无法看到系统托盘中的图标,但我的应用程序工作完美。

我尝试了不同的方式来显示应用程序的形式,例如,应用程序在文件中读取一个标志,当标志为true时,它会强制form.Show()但不起作用。

我想我必须在桌面载入时向应用程序表单提交资源管理器(进程),但我不知道这是怎么回事。这是正确的方式?我在等你的建议。

问候

回答

2

我想,这是由于这样的事实,当没有人登录,没有桌面会话来运行应用程序。

即使应用程序可以正常工作,这是没有在稍后登录的用户下运行,所以您看不到该图标。它作为一个不同的用户在后台运行。

这与使用远程桌面登录两个用户时效果相同。可以启动一个创建系统托盘图标的应用程序,另一个用户将看不到该图标。

另一种方法是将应用程序的逻辑放入一个windows服务中。然后,我会创建一个客户端,在用户登录时自动运行,检查服务当前是否处于活动状态并显示图标和表单。

1

当您的应用程序在您未登录的情况下启动时,没有桌面环境,因此您的代码显示系统托盘上的图标本质上“失败” - 发送到站点图标的消息已发送,但是没有听到他们,当然也没有人在看。

当您随后登录并创建桌面环境时,您的应用程序已在运行,并且无法知道(但)现在有一个可见的桌面来注册该图标。它在开始时进行了图标注册,并且就其所担心的部分工作完成而言。

因此,您需要一种方式来告诉应用程序您正在使用桌面和系统托盘以准备好其中的图标,然后应用程序需要重复图标注册过程。如果您不想通过创建服务/客户端安排将核心逻辑与表示层分开,则可以将您的应用程序放在启动组中,以便在您登录时运行。

您不希望两个副本运行,因此可以调整应用程序以检查其自身的其他实例,以及是否有其他实例将焦点切换到自己并自杀。然后,在焦点处理程序中,禁用并重新启用图标托盘注册以重新发送这些消息。