C# 如何获取以用户身份运行的Windows 7应用程序的MainWindowHandle<;foo>;从作为本地系统运行的服务中?

C# 如何获取以用户身份运行的Windows 7应用程序的MainWindowHandle<;foo>;从作为本地系统运行的服务中?,c#,windows,windows-services,pinvoke,hwnd,C#,Windows,Windows Services,Pinvoke,Hwnd,我创建了一个作为本地系统用户运行的服务。此服务使用本机互操作和CreateProcessAsUser()方法(以当前登录用户而不是本地系统的身份运行)启动并监视Silverlight浏览器外应用程序。我能够获得派生进程的句柄,并执行诸如Kill()之类的操作,但是,我意识到服务无法获得子应用程序主窗口的句柄,因为子应用程序以不同的用户身份运行。我在Windows7上运行 我的最终目标是在进程停止响应时正确响应(即Process.responding==false),这样我就可以终止应用程序并重新

我创建了一个作为本地系统用户运行的服务。此服务使用本机互操作和CreateProcessAsUser()方法(以当前登录用户而不是本地系统的身份运行)启动并监视Silverlight浏览器外应用程序。我能够获得派生进程的句柄,并执行诸如Kill()之类的操作,但是,我意识到服务无法获得子应用程序主窗口的句柄,因为子应用程序以不同的用户身份运行。我在Windows7上运行

我的最终目标是在进程停止响应时正确响应(即Process.responding==false),这样我就可以终止应用程序并重新启动它。但是,Process.Responding需要进程主窗口的句柄(确切地说是Process.MainWindowHandle),但是在这种情况下,Process.MainWindowHandle始终返回0

我被难住了。在Win7中,一个用户是否有办法获得作为另一个用户运行的进程的窗口句柄


提前感谢您提供的所有帮助。

不,这是不可能的。出于安全原因,Windows服务与用户模式应用程序完全隔离。如果你能得到一个窗口的句柄,你就可以操纵这个窗口,或者与之交互,留下一个巨大的安全漏洞

有关更多信息,请访问:

严格地说,你使用Windows服务的初衷是糟糕的设计。它不应该创建或启动任何用户模式进程,也不应该以任何方式与用户交互。请记住,即使没有用户登录,服务也会运行!因此,他们不应该启动应用程序

更好的解决方案是一个简单的后台应用程序,设置为在用户登录时自动启动。然后,这个后台应用程序可以启动Silverlight应用程序,监视其状态,并根据需要与之交互,因为两者都将在同一本地用户帐户的上下文中运行。其效果类似于服务,但没有隔离的任何缺点。在VisualStudio中实现这一点最简单的方法是创建一个WinForms应用程序(或者可能是一个WPF应用程序,我在这方面的经验较少),它根本不显示任何窗体/窗口