0

我使用 Windows Server 2003(和 2008)和 C#,我的桌面系统托盘有问题。我已经完成了一个用于磁盘管理的应用程序,当应用程序启动时,它会从任务栏中隐藏自己并在系统托盘中添加一个图标。当我单击此图标(在系统托盘中)时,将显示应用程序的表单。

我在系统调度程序中创建了一个任务以在特定时间自动执行应用程序,如果我在应用程序启动时(从调度程序)登录服务器,则图标出现在桌面的系统托盘中。但是,如果我没有登录服务器并且调度程序午餐我的应用程序,当我登录时,我在系统托盘中看不到图标,但我的应用程序运行良好。

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

我想我必须在加载桌面时将我的申请表通知资源管理器(进程),但我不知道如何做到这一点。是正确的方式吗?我在等你的建议。

最好的祝福

4

2 回答 2

2

我想这是因为当没有人登录时,没有桌面会话来运行应用程序。

即使应用程序可以正常运行,它也不会在稍后登录的用户下运行,因此您看不到图标。它在“后台”作为不同的用户运行。

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

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

于 2010-07-13T14:37:55.027 回答
1

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

当您随后登录并创建桌面上下文时,您的应用程序已经在运行并且无法知道(还)现在有一个可见的桌面来注册图标。它在启动时进行了图标注册,就它而言,部分工作已经完成。

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

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

于 2010-07-13T14:47:09.760 回答