gpt4 book ai didi

c# - MMC 进程立即关闭,无法链接到 Windows 窗体

转载 作者:太空宇宙 更新时间:2023-11-03 12:21:15 24 4
gpt4 key购买 nike

我正在尝试做的最终目标是将 MMC(Microsoft 管理控制台)计算机管理管理单元 (compmgmt.msc) 进程嵌入到 Windows 窗体中,或者将其视为模态弹出菜单。

现在,我只是想让 mmc.exe 本身正常工作,然后再尝试加载管理单元。问题的第一部分是 mmc.exe 进程几乎立即退出。

编辑: 如果应用程序构建为 32 位(我的机器是 64 位),mmc.exe 只会立即退出。如果应用程序构建为 64 位,则第一个进程保留,这是预期的行为。但是,我仍然很好奇为什么会出现奇怪的临时进程行为。请注意,启动的临时 mmc.exe 进程是 32 位的,但最终启动的 mmc.exe 是 64 位的。奇怪。

以下代码将成功地将 iexplore.exe 嵌入到 Windows 窗体中,但未能嵌入 mmc.exe。它失败的原因是在调用 p.WaitForInputIdle() 时发生的异常;

An unhandled exception of type 'System.InvalidOperationException' occurred in System.dll

Additional information: Cannot process request because the process has exited.

正如您从错误消息中看到的那样,进程在几毫秒内退出,但从用户的角度来看,MMC 的 GUI 仍然作为一个单独的、与我启动的原始进程无关的进程弹出。

这意味着正在创建另一个 mmc.exe 进程,它似乎与创建的原始进程无关。

那么问题是:为什么 MMC 进程立即关闭,而另一个 MMC 进程几乎立即打开?

相关的 Windows 窗体代码,类似于 this question .

[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

private void Form1_KeyPress(object sender, EventArgs e)
{
/// Uncomment *one* of these:
//Process p = Process.Start("mmc.exe");
//Process p = Process.Start("iexplore.exe");
Thread.Sleep(500);

p.WaitForInputIdle();

Console.WriteLine("MainWindowHandle: " + p.MainWindowHandle);
Console.WriteLine("Handle: " + p.Handle);

Thread.Sleep(5000);
SetParent(p.MainWindowHandle, this.Handle);
}

相关,但问题似乎更多是关于控制台 GUI 本身的关闭,不允许编辑,而不是一些底层进程关闭。 https://superuser.com/questions/194252/mmc-exe-starts-and-then-immediately-stops



随后的问题是,即使我 located the new mmc process that pops up ,它似乎将 MainWindowHandle 设置为 null,possibly meaning Windows doesn't recognize it as having a GUI .

解决方法是在创建“临时”mmc 进程和等待新进程实际准备就绪之间简单地添加 sleep (暂停)。请注意 process.WaitForInputIdle(); 没有足够长的等待时间。

对于可能遇到和我一样的麻烦的人:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = Environment.SystemDirectory + "\\" + "mmc.exe";
startInfo.Arguments = "\"" + Environment.SystemDirectory + "\\compmgmt.msc\" /s";
Process tempProcess = Process.Start(startInfo);
tempProcess.WaitForExit();

Thread.Sleep(500); // Added pause!
// Better alternative is to use a while loop on (MainWindowHandle == null)
// with some sort of timeout

Process[] processes = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(startInfo.FileName));
foreach (Process process in processes)
{
// do what you want with the process
Console.WriteLine("MainWindowHandle: " + process.MainWindowHandle);
// Set Computer Management window on top
SetWindowPos(process.MainWindowHandle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
SetParent(process.MainWindowHandle, this.Handle);
SetWindowLong(process.MainWindowHandle, GWL_STYLE, WS_VISIBLE);

process.WaitForExit();
}

但主要问题是弄清楚第一个 MMC 进程退出的原因。

最佳答案

它退出是因为它可能需要使用不同位深度的 MMC 来运行管理单元。正如我现在刚刚了解到的那样,管理单元可以是 32 位或 64 位的。 Windows 可能需要使用 C:\Windows\SysWOW64\mmc.exe(1.34 MB(1,409,024 字节))或使用 C:\Windows\System32\mmc.exe(1.71 MB(1,802,240 字节))重新启动管理单元。 https://learn.microsoft.com/en-us/previous-versions/windows/desktop/legacy/ms692753(v=vs.85)

因此,对我而言,手头的任务似乎是如何在启动管理单元之前发现该管理单元的位深度。

关于c# - MMC 进程立即关闭,无法链接到 Windows 窗体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47083917/

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