C# 从Windows服务运行Windows窗体应用程序

C# 从Windows服务运行Windows窗体应用程序,c#,winapi,windows-services,C#,Winapi,Windows Services,我们有一个第三方遗留软件,我们需要从一个服务运行,我们希望使用窗口消息来自动点击按钮,抑制消息框等 问题是我似乎无法在表单处于活动状态时启动流程,我可以使用process.getProcessByName(“ProcessName”)检索流程但是MainWindowHandle和MainWindowTitle为空 是否有方法从服务启动Windows客户端程序,以便正确创建表单?服务在与用户桌面不同的会话中运行,即臭名昭著的会话0。由于Vista长期存在粉碎攻击问题,它被隔离,谷歌“会话0隔离”以

我们有一个第三方遗留软件,我们需要从一个服务运行,我们希望使用窗口消息来自动点击按钮,抑制消息框等

问题是我似乎无法在表单处于活动状态时启动流程,我可以使用
process.getProcessByName(“ProcessName”)检索流程
但是
MainWindowHandle
MainWindowTitle
为空


是否有方法从服务启动Windows客户端程序,以便正确创建表单?

服务在与用户桌面不同的会话中运行,即臭名昭著的会话0。由于Vista长期存在粉碎攻击问题,它被隔离,谷歌“会话0隔离”以了解更多信息

会话0仍有桌面,您无法切换到它。获取空MainWindowHandle的最典型诊断是等待时间不够长,无法允许进程创建它。您至少需要Process.waitForInputId()

这并不能保证一个解决方案,您仍然有一个非常严重的问题,即检测程序是否行为不当。或者,MainWindowHandle实际上是启动屏幕的句柄,而不是主窗口,因此自启动屏幕关闭后为空。或者该程序由于无法使用其他用户帐户或不常见的工作目录而停止运行。诸如此类,在您尝试将其作为服务运行之前,您需要首先使用控制台模式程序来解决这些问题


在这一点上,最好还是让它保持一个控制台模式的应用程序。因为故障是完全无法诊断的,所以当IT人员打电话给您时,您的后端会一直感到痛苦,因为它停止工作,您也没有什么可看的。

Windows服务在没有桌面的用户环境中运行。这就是为什么不能从服务中使用windows。请尝试将服务正在使用的用户更改为您希望打开窗口的用户。我不想向真实用户显示表单,我想通过编程与表单交互,换句话说,我想让旧的遗留软件作为服务工作,以便我们的后端可以使用MQ或WCFWell等现代技术与之通信,我认为这将不起作用-正如我所说,windows服务默认情况下不承载桌面,因此您无法创建windows:/好的,但是像Automatic这样的商业工具是如何做到的呢?它们可以在没有用户登录的情况下调用表单并与表单交互。我想知道是否可以从服务登录用户?这样我就可以登录用户并从该帐户运行该程序。这是一个旧的业务分析软件,我没有访问源代码的权限,因此我恐怕只能使用Winforms应用程序:/Btw,我无法获得任何进程来获取主窗口或任何窗口。。您确定它会在会话0中为表单创建句柄吗?我特别警告您,无法检测应用程序的彻底失败。一个预览,你将不得不处理,一旦你把它投入生产。你真的必须首先让它与控制台应用程序一起工作。你是说控制台应用程序而不是服务,还是说从服务而不是表单应用程序运行控制台应用程序?我制作了一个SPIKE/POC,并通过控制台应用程序的消息成功地控制了Forms应用程序。这是可行的,现在我只是需要让它在没有登录的情况下工作,inI实际上让它工作了,不得不使用Win32 FindWindow而不是C#内置版本。如果我在交互模式下运行服务,我可以登录并看到寡妇们的行动,因此如果事情没有按预期进行,这很好