我们有一个第三方遗留软件,我们需要从服务中运行,我们希望使用窗口消息来自动化它来点击按钮、抑制消息框等。
问题是我似乎无法在表单处于活动状态时启动进程,我可以使用Process.GetProcessesByName("ProcessName");
但MainWindowHandle
andMainWindowTitle
为空来检索进程。
有没有办法从服务启动 Windows 客户端程序以便正确创建表单?
我们有一个第三方遗留软件,我们需要从服务中运行,我们希望使用窗口消息来自动化它来点击按钮、抑制消息框等。
问题是我似乎无法在表单处于活动状态时启动进程,我可以使用Process.GetProcessesByName("ProcessName");
但MainWindowHandle
andMainWindowTitle
为空来检索进程。
有没有办法从服务启动 Windows 客户端程序以便正确创建表单?
服务在与用户桌面不同的会话中运行,即臭名昭著的会话 0。自 Vista 以来,由于破碎攻击的长期问题,它被隔离,谷歌“会话 0 隔离”以了解更多信息。
会话 0 仍然有一个桌面,您只是无法切换到它。获取 null MainWindowHandle 的最典型诊断方法是等待时间不够长以允许进程创建它。您至少需要 Process.WaitForInputIdle()。
这并不能完全保证解决方案,您仍然有一个非常严重的问题检测到程序行为不端。或者就此而言, MainWindowHandle 实际上是启动屏幕的句柄而不是主窗口,因此由于启动屏幕被关闭,因此为 null。或者该程序因使用不同的用户帐户或不常见的工作目录而无法正常工作而崩溃。等等,在您尝试将其作为服务运行之前,您需要先通过控制台模式程序来解决这些问题。
此时最好将其保留为控制台模式应用程序。因为故障是完全无法诊断的,所以当 IT 人员打电话给您时,您的后端将一直感到痛苦,因为它停止工作并且您也没有什么可看的。