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

标签 c# winforms windows-xp

我一直在开发一个适用于 Windows XP 的应用程序,该应用程序需要在 Windows 启动的同时以管理员级别权限启动,因此我继续使用任务计划程序将 exe 添加到“在系统启动时运行”。

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

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

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

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

关于该程序的一些注释,它在第一次启动时最初不会显示任何内容。它创建一个表单

WndHidden wnd = new WndHidden()

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

我做错了什么?

最佳答案

其实你这里的情况很严重。您希望进程在启动时运行,即使没有用户登录。您再次希望进程在屏幕上显示表单。现在冲突了!表单可以显示在某些登录用户的桌面上。没有用户 - 没有桌面 - 没有表单。

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

进程不能干扰其他用户的桌面。因此您的流程无法在其他用户或通过快速切换登录的用户上显示表单。

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


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

将所有 UI 逻辑放入第二个可执行文件中。注册第二个可执行文件以在每个用户启动时运行。事先不要显示任何表格。最好做一个托盘图标项目。休眠在每个用户的桌面上。

你的主进程是单一的并且独立于用户。每个用户的从属进程持有 UI。诀窍是将信号从主机传递到相应的从机。设置一种通信介质,类似于 IPC(进程间通信)。当从机上线时,主机会收到通知。主站甚至可以选择要求哪个从站(用户)显示表格。即使多个用户通过远程桌面同时登录,此机制也能发挥作用。


对于IPC,您可以选择的范围很广。选项有:1. TCP/IP、2. 命名管道、3. WCF(tcp/命名管道)、4. 远程处理。

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

您想要完成的事情实际上比看起来复杂得多。在 XP 中这很容易,但这就是为什么 XP 比 Vista+ 更容易受到恶意软件和病毒的影响。欢迎再次询问。

关于c# - 计划启动 C# 应用程序无法为登录用户显示表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20486451/

相关文章:

c# - 具有复杂类型的 IDataErrorInfo

c# - 如何在数据表的列中查找字符串

delphi - Delphi 4 Pro可以在Windows XP(或更高版本)上可靠地安装和使用吗?

c# - 如何使用 StringBuilder AppendFormat 行

c# - FluentMigrator 从进程内迁移运行程序生成 SQL 输出

c# - 无法删除 ListView 中显示的图像文件

visual-c++ - 如何在XP(C++)中获取公共(public)桌面文件夹路径?

c# - 使用脚本编辑 windows xp 注册表

c# - 将数据导出到 excel 时按钮可见错误的问题

c# - 我的 SQLite 数据库是在哪里创建的?