gpt4 book ai didi

c# - 启动启动进程 B 的 Win32 进程 A——获取 B 的 ID/HWND

转载 作者:行者123 更新时间:2023-11-30 18:41:57 25 4
gpt4 key购买 nike

好吧,我在这个网站上花了一点时间弄清楚如何使用来自 C# 的 Win32 调用来启动“子”进程(即,新进程将窗口父级设置为我)。只要它不跨越 UAC 边界,它就可以工作。很好。

现在我正在尝试使用一个卸载程序(进程 A)来执行此操作,该卸载程序会引导一个实际执行工作的临时程序(进程 B)。进程 A 在创建 B 后消失。我的代码需要一个进程 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,但我需要获取其中之一。

谢谢!

最佳答案

一个简单的解决方案可能是,在尝试获取其 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;
}
}

关于c# - 启动启动进程 B 的 Win32 进程 A——获取 B 的 ID/HWND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6203088/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com