在Windows服务器中使用系统托盘图标的c#问题

时间:2010-07-13 14:22:09

标签: c# icons windows-explorer systray

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

我在系统调度程序中创建了一个任务,以便在特定时间自动执行应用程序,如果我在应用程序被启动时登录服务器(从调度程序),则该图标将出现在桌面系统中。但是,如果我没有登录服务器并且调度程序在我的应用程序中休息,当我登录时,我无法在系统托盘中看到该图标,但我的应用程序运行正常。

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

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

最好的问候

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

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

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

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