好的,我花了一些时间在这个网站上,使用来自C#的Win32调用,弄清楚如何启动一个“子”进程(即新进程设置窗口父对象)。只要它不跨越UAC边界,它就有用了。细
现在我尝试使用卸载程序(进程A)来执行此操作,该程序引导临时程序(进程B)实际完成工作。创建B后,进程A消失。我的代码需要一个进程ID,从中获取一个传递给SetParent的窗口句柄。看起来像这样:
Process p = new Process();
try
{
p.EnableRaisingEvents = true;
p.StartInfo.FileName = fileName;
p.StartInfo.Arguments = arguments;
if (p.Start())
{
p.WaitForInputIdle(10000);
IntPtr pHwnd = p.MainWindowHandle;
if (pHwnd == IntPtr.Zero)
{
return null;
}
IntPtr currentHwnd = Process.GetCurrentProcess().MainWindowHandle;
if (SetParent(pHwnd, currentHwnd) == 0)
{
if (Marshal.GetLastWin32Error() == 5) // access denied
{
// Need to launch privileged process that launches process
// and sets parent on UAC enabled OS.
}
else
{
return null;
}
}
// AND SO ON AND SO FORTH
只要p不会消失,效果就会很好。在这种情况下,p在启动p'后出现繁荣。无论如何,p永远不会有窗口句柄。
那么我如何监视p以查看它是否开始p'并获得p'的id(或更重要的是窗口句柄)?我可以从id获得HWND,但我需要得到一个或另一个。
谢谢!
答案 0 :(得分:0)
一个简单的解决方案可能是,在尝试获取其MainWindowHandle之前检查p是否为null。以下是一些示例代码,您可以根据需要进行调整。
using (Process proc = new Process())
{
proc.StartInfo.FileName = filename;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.WorkingDirectory = ClientInstallPath;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.Start();
if (proc != null)
{
proc.WaitForExit();
returnCode = proc.ExitCode;
}
}