我使用windows server 2003 (和2008)和C#,我有一个桌面系统托盘的问题。我做了一个磁盘管理的应用程序,当应用程序启动时,它从任务栏中隐藏自己,并在系统托盘中添加一个图标。当我点击这个图标(在系统托盘中)时,应用程序的表单就会显示出来。
我已经在系统调度程序中创建了一个任务,以便在特定时间自动执行应用程序,如果我在应用程序启动时登录到服务器上(从调度程序),图标会出现在桌面的系统托盘中。但是,如果我没有登录服务器和计划程序,当我登录时,我看不到系统托盘中的图标,但我的应用程序工作正常。
我尝试了不同的方法来显示应用程序表单,例如,应用程序读取文件中的标志,当标志为真时,它强制form.Show()但不起作用。
我想我必须在桌面加载时通知资源管理器(进程)我的申请表单,但我不知道如何做到这一点。这是正确的方式吗?我在等你的建议。
诚挚的问候
发布于 2010-07-13 22:37:55
我认为这是因为当没有人登录时,没有桌面会话来运行应用程序。
即使应用程序可能工作正常,但它不是在稍后登录的用户下运行,因此您看不到图标。它在后台以不同的用户身份运行。
这实际上与两个用户使用远程桌面登录时相同。一个用户可以启动一个创建systray图标的应用程序,其他用户将看不到该图标。
一种替代方案是将应用程序的逻辑放入windows服务中。然后,我将创建一个在用户登录时自动运行的客户端,检查服务当前是否处于活动状态,并显示图标和表单。
发布于 2010-07-13 22:47:10
当你的应用程序在你没有登录的情况下启动时,没有桌面上下文,所以你在系统托盘上显示图标的代码本质上是“失败”的--发送到图标的站点的消息被发送了,但是没有任何东西在监听它们,当然也没有人在看它们。
当您随后登录并创建桌面上下文时,您的应用程序已经在运行,并且无法知道(到目前为止)现在有一个可见的桌面来注册图标。它在启动时完成了图标注册,并且就它而言,部分工作已经完成。
因此,你需要一种方法来告诉应用程序,你在那里有一个桌面和一个系统托盘,准备在其中有一个图标,然后应用程序需要重复图标注册过程。如果您不想通过创建服务/客户端排列将核心逻辑与表示层分开,则可以将应用程序放在Startup组中,以便在您登录时运行。
你不想运行两个副本,所以调整应用程序以检查自身的其他实例,如果有一个实例将焦点切换到它并杀死它自己。然后,在焦点处理程序中,禁用然后重新启用图标托盘注册以重新发送这些消息。
https://stackoverflow.com/questions/3238119
复制相似问题