c#的过程.mainwindowwhandle总是返回IntPtr 0

本文关键字:返回 IntPtr 过程 mainwindowwhandle | 更新日期: 2023-09-27 18:10:50

这是我的代码:

            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();
                }
            }

问题是,那个游戏。mainwindowwhandle总是intptr . 0。我需要找到运行进程的IntPtr,以确认游戏是由启动器启动的,所以我让游戏发送它的IntPtr,并让启动器响应,如果可以的话。但是,为此,我必须知道运行进程的IntPtr。

提前感谢!

c#的过程.mainwindowwhandle总是返回IntPtr 0

主窗口是当前具有焦点的进程打开的窗口(顶层窗体)。如果改变了当前主窗口句柄,则必须使用Refresh方法刷新Process对象以获取当前主窗口句柄。

您只能为在本地计算机上运行的进程获得MainWindowHandle属性。mainwindowwhandle属性是一个唯一标识与进程相关联的窗口的值。

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

如果你刚刚启动了一个进程,想要使用它的主窗口句柄,考虑使用WaitForInputIdle方法来允许进程完成启动,确保主窗口句柄已经创建。

一种解决方法是枚举所有顶级窗口并检查它们的进程id,直到找到匹配的…


    [DllImport("user32.dll")]
    public static extern IntPtr FindWindowEx(IntPtr parentWindow, IntPtr previousChildWindow, string windowClass, string windowTitle);
    [DllImport("user32.dll")]
    private static extern IntPtr GetWindowThreadProcessId(IntPtr window, out int process);
    private IntPtr[] GetProcessWindows(int process) {
        IntPtr[] apRet = (new IntPtr[256]);
        int iCount = 0;
        IntPtr pLast = IntPtr.Zero;
        do {
            pLast = FindWindowEx(IntPtr.Zero, pLast, null, null);
            int iProcess_;
            GetWindowThreadProcessId(pLast, out iProcess_);
            if(iProcess_ == process) apRet[iCount++] = pLast;
        } while(pLast != IntPtr.Zero);
        System.Array.Resize(ref apRet, iCount);
        return apRet;
    }
while (!proc.HasExited)
{
    proc.Refresh();
    if (proc.MainWindowHandle.ToInt32() != 0)
    {
        return proc.MainWindowHandle;
    }
}