这是我的代码:

            using (Process game = Process.Start(new ProcessStartInfo() {
        FileName="DatabaseCheck.exe",
        RedirectStandardOutput = true,
        CreateNoWindow = true,
        UseShellExecute = false }))
        {
            lblLoad.Text = "Loading";
            int Switch = 0;

            while (game.MainWindowHandle == IntPtr.Zero)
            {
                Switch++;
                if (Switch % 1000 == 0)
                {
                    lblLoad.Text += ".";
                    if (lblLoad.Text.Contains("...."))
                        lblLoad.Text = "Loading.";

                    lblLoad.Update();
                    game.Refresh();
                }
            }

问题是,那个game.MainWindowHandle始终是IntPtr.Zero。我需要找到运行过程的IntPtr来确认游戏是由启动程序启动的,所以我让游戏将其发送为IntPtr,并让启动程序做出响应。但是为此,我必须特别了解运行过程的IntPtr。

提前致谢!

最佳答案

主窗口是当前具有焦点的过程(TopLevel窗体)打开的窗口。如果已更改,则必须使用Refresh方法将Process对象刷新为,以获取当前的主窗口句柄。

您只能为本地计算机上运行的进程获取MainWindowHandle属性。 MainWindowHandle属性是一个值,用于唯一标识与流程关联的窗口。

仅当流程具有图形界面时,流程才具有与之关联的主窗口。如果关联的进程没有主窗口,则MainWindowHandle值为零。对于已隐藏的进程,即在任务栏中不可见的进程,该值也为零。对于在任务栏最右侧的通知区域中显示为图标的进程,可能是这种情况。

如果您刚刚启动了一个进程并想要使用其主窗口句柄,请考虑使用WaitForInputIdle方法以允许该进程完成启动,并确保已创建了主窗口句柄。否则,将引发异常。

关于c# - C#Process.MainWindowHandle始终返回IntPtr零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16185217/

10-12 07:36