计划的启动C#应用程序无法显示登录用户的表单

时间:2013-12-10 04:58:48

标签: c# winforms windows-xp

我一直在开发一个Windows XP应用程序,需要在Windows启动的同时启动管理员权限,所以我继续使用Task Scheduler将exe添加到“在系统启动时运行”。 / p>

在任何给定时间都不应该有多个应用程序实例运行。理想情况下,应用程序将在Windows启动时启动,然后无论登录哪个用户,或者如果用户在一天中注销并登录,我的应用程序将始终在后台运行。这样,即使用户使用“快速用户切换”进行切换,我的应用程序也将继续在用户之间运行。

所有这一切似乎都正确到位。但是,偶尔我的应用程序需要以某种方式显示表单或与用户交互,这就是它崩溃的地方。表格没有显示(虽然我相信它们正在运行)。如果我使用Process类并尝试执行程序,它们会在任务管理器中显示为正在运行,但它们实际上并未显示。在检查它们时,它们不会在Process Hacker中列出任何句柄。这就像他们只是在后台默默地运行。

我不能仅仅因为多种原因而将任务更改为在用户登录上运行。一,我很确定我必须将计划任务添加到每个用户。二,应该只运行一个这个程序的实例,我担心如果有人使用快速用户切换,那么程序的两个实例就会运行。即使我检测到一个实例已经在运行,它也无法解决问题,因为用户#1的实例#1无法显示用户#2的表单/窗口(我不认为,如果我是的话,请更正我但在这一点上错了。)

理想情况下,我想继续在系统启动时运行,并找出为什么我无法显示任何窗口。

关于该程序的情侣说明,它在最初启动时最初没有显示任何内容。它创建了一个表单

WndHidden wnd = new WndHidden()

然后只运行Application.Run()而不传递表单,然后等待某些系统提示何时向用户显示表单/消息。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

实际上你在这里遇到了很多情况。您希望您的进程在启动时运行,即使没有用户登录也是如此。您希望进程再次在屏幕上显示表单。现在那个冲突!一个表单可以显示在一些登录用户的桌面上。没有用户 - 没有桌面 - 没有表格。

每个进程都属于某个用户。如果没有用户登录,则该进程属于SYSTEM。每个用户都有自己的桌面。登录用户有一个真正的桌面,SYSTEM有一个虚拟桌面。因此,您的表单正在显示,但不是在真实桌面上,而是在虚拟桌面上。因此你看不到它。

进程无法插入其他用户的桌面。因此,您的流程无法在通过快速切换记录的其他用户或用户上显示表单。

如果您忘记了快速用户切换部分并且只对一个用户满意,那么在安排它时您可以指定该特定用户的凭据。这样你就得到了你想要的东西,除了多用户场景。但要注意,如果用户更改密码,则计划任务会中断。你必须重新安排它。


您想要的是大多数防病毒软件显示的行为。你需要 2 可执行文件。 (可以使用一个exe来完成,但不要让事情复杂化)在任何用户登录之前使第一个进程在启动时运行。使用常用的SYSTEM帐户运行它。如果可能的话,将进程注册为windows-service,而不是计划任务。不要在过程中放置​​任何用户界面逻辑。

将所有UI逻辑放在第二个可执行文件中。注册第二个可执行文件,以便在每个用户启动时运行。不要事先显示任何形式。更好地制作托盘图标项目。在每个用户的桌面上休眠。

您的主流程是单一且独立于用户的。每用户从属进程持有UI。诀窍是将信号从主设备传递给相应的从设备。建立通信媒介,一种IPC(进程间通信)。当奴隶上线时,主人将收到通知。主人甚至可以选择要求哪个奴隶(用户)来表示表格。即使多个用户同时通过远程桌面登录,此机制也能正常工作。


对于IPC,您可以选择范围广泛。选项包括:1。TCP / IP,2。命名管道,3。WCF(tcp / named-pipe),4。远程处理。

如果上面的名字不熟悉,我建议使用普通的TCP / IP,但请尽快将通信升级到WCF。

你想要实现的目标实际上比看上去复杂得多。在XP中,这本来很容易,但这就是为什么XP更容易受到恶意软件和病毒的影响,而不是Vista +。随便再问一下。