我在Windows 7中有一个在Session 0中运行的c#应用程序。 该应用程序基本上是一个软件补丁安装框架,它将在后台安装补丁(在会话0中)。
因此,此应用程序将从服务器下载修补程序并开始在客户端计算机上安装它们。安装补丁的方法是调用CreateProcess(“Patch.exe”)。
现在大多数情况下,Patch.exe将是一个非ui静默安装,从此以后,从会话0安装补丁成功完成。
但是,有时这个Patch.exe中碰巧有一些UI元素,比如提示用户提供一些细节(比如安装位置等等),让我们说这些UI元素是无法避免的。
我的安装框架(在C#中编写的会话0中运行)是否可以知道我的框架创建的进程Patch.exe中是否包含任何UI元素?
我问的原因是,如果我确定应用程序中有任何UI元素,那么我不想继续安装(粗略的做法是杀死安装程序进程Patch.exe,但这是一个不同的故事,而不是在这里关注。)
答案 0 :(得分:2)
不容易。如果它们是本机Win32可执行文件,您可以尝试挂钩CreateWindowEx WinAPI函数。 (有关挂钩API调用的方法,请参阅Detours。)
对于.NET,您可以确定它是否引用System.Windows.Forms程序集。
两者都不是一个完美的解决方案。最好的解决方案是强制一个策略,补丁永远不应该显示UI(或者可以接受命令行来禁止任何UI)。但我猜这是不可能的。
答案 1 :(得分:2)
您可以使用EnumWindows
API函数遍历每个窗口,并通过调用GetWindowThreadProcessId
检查它是否属于您的Patch.exe实例(假设您已为Patch.exe创建了进程,有它的PID)。您可以通过使用GetWindowLong
参数调用GWL_STYLE
来强制执行此检查,并检查生成的样式是否设置了WS_VISIBLE
位。某些应用程序可以创建隐藏的窗口来执行与用户界面实际上没有关系的事情。
或者,您可以使用带有参数SetWinEventHook
的{{1}}在每次创建新窗口时接收通知。然后您可以执行上述检查。