Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计划启动C应用程序无法为登录用户显示表单_C#_Winforms_Windows Xp - Fatal编程技术网

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

C# 计划启动C应用程序无法为登录用户显示表单,c#,winforms,windows-xp,C#,Winforms,Windows Xp,我一直在为Windows XP开发一个应用程序,该应用程序需要在Windows启动的同时使用管理员级别的权限启动,因此我继续添加了exe,使用任务调度器在系统启动时运行 在任何给定的时间,应用程序运行的实例不得超过一个。理想情况下,应用程序将在Windows启动时启动,然后无论哪个用户登录,或者如果用户在一天中注销并登录,我的应用程序都将始终在后台运行。这样,即使用户使用快速用户切换进行切换,我的应用程序也会在用户之间保持运行 在某种程度上,所有这些似乎都是正确的。然而,有时我的应用程序需要显示

我一直在为Windows XP开发一个应用程序,该应用程序需要在Windows启动的同时使用管理员级别的权限启动,因此我继续添加了exe,使用任务调度器在系统启动时运行

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

在某种程度上,所有这些似乎都是正确的。然而,有时我的应用程序需要显示一个表单或以某种方式与用户交互,这就是它出现故障的地方。虽然我相信表格正在运行,但它不会出现。如果我使用Process类并尝试执行程序,它们会在任务管理器中显示为正在运行,但实际上不会显示。他们在检查过程中也没有列出任何句柄。就像他们只是在后台默默地奔跑

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

理想情况下,我希望在系统启动时保持它的运行,并找出为什么我不能显示任何窗口

关于这个程序的一些注释,当它第一次启动时,它并没有显示任何内容。它创建了一个表单

WndHidden wnd = new WndHidden()
然后只运行应用程序。运行时不传递表单,然后只等待特定的系统提示,等待何时向用户显示表单/消息


我做错了什么?

事实上,你这里的情况很糟糕。您希望进程在启动时运行,即使没有用户登录。同样,您希望流程在屏幕上显示表单。现在,冲突!对于表单,可以在某些登录用户的桌面上显示。没有用户-没有桌面-没有表单

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

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

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

您想要的是大多数防病毒软件所显示的行为。您需要2个可执行文件。它可以用一个exe来完成,但让我们不要把在任何用户登录之前让第一个进程在启动时运行的问题复杂化。使用常用的系统帐户运行它。如果可能,将进程注册为windows服务,而不是计划任务。不要在过程中使用任何用户界面逻辑

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

您的主进程是单一的,独立于用户。每个用户的从属进程保存UI。诀窍是将信号从主设备传递到相应的从设备。设置一种通信媒介,即IPC进程间通信。当从机联机时,主机将收到通知。主用户甚至可以选择请求哪个从属用户显示表单。即使多个用户通过远程桌面同时登录,此机制也可以工作

至于IPC,您可以从很多方面进行选择。选择是:1。TCP/IP协议,2。命名管道,3。WCF tcp/命名管道,4。远程处理

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


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

事实上,你在这里的处境相当艰难。您希望进程在启动时运行,即使没有用户登录。再一次,你是w ant在屏幕上显示表单的过程。现在,冲突!对于表单,可以在某些登录用户的桌面上显示。没有用户-没有桌面-没有表单

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

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

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

您想要的是大多数防病毒软件所显示的行为。您需要2个可执行文件。它可以用一个exe来完成,但让我们不要把在任何用户登录之前让第一个进程在启动时运行的问题复杂化。使用常用的系统帐户运行它。如果可能,将进程注册为windows服务,而不是计划任务。不要在过程中使用任何用户界面逻辑

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

您的主进程是单一的,独立于用户。每个用户的从属进程保存UI。诀窍是将信号从主设备传递到相应的从设备。设置一种通信媒介,即IPC进程间通信。当从机联机时,主机将收到通知。主用户甚至可以选择请求哪个从属用户显示表单。即使多个用户通过远程桌面同时登录,此机制也可以工作

至于IPC,您可以从很多方面进行选择。选择是:1。TCP/IP协议,2。命名管道,3。WCF tcp/命名管道,4。远程处理

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


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

可能有帮助:exe在哪个用户帐户下运行?它以AdminUser的身份运行,AdminUser是计算机上唯一的管理员帐户,其他所有人都是有限用户。可能有帮助:exe在哪个用户帐户下运行?它以AdminUser的身份运行,AdminUser是计算机上唯一的管理员帐户,其他人都是有限用户。感谢好奇,只是为了澄清一下,该流程现在以管理员身份运行,因为这些是通过任务调度器分配的凭据。如果我将程序重写为服务呢?这会不会限制它只运行一个实例,并显示表单?作为一个服务,它将作为单个实例运行,但不显示表单。虽然服务可以呈现形式,但在实践中却毫无帮助。1-service-n-user-agents是最长但最灵活和稳定的解决方案。感谢好奇,只是为了澄清一下,该流程现在以管理员身份运行,因为这些是通过任务调度器分配的凭据。如果我将程序重写为服务呢?这会不会限制它只运行一个实例,并显示表单?作为一个服务,它将作为单个实例运行,但不显示表单。虽然服务可以呈现形式,但在实践中却毫无帮助。1-service-n-user-agents是最长但最灵活和稳定的解决方案。