与他的孩子一起在C#程序中运行另一个应用程序

时间:2015-12-11 10:49:01

标签: c# windows winforms winapi process

我使用示例代码从特定的List

中搜索到我的Windows窗体应用程序的进程
void processStartEvent_EventArrived(object sender, EventArrivedEventArgs e)
{
    string processName = e.NewEvent.Properties["ProcessName"].Value.ToString();
    int processID = Convert.ToInt32(e.NewEvent.Properties["ProcessID"].Value);

    if (_processNames.Contains(processName))
    {
        Process proc = Process.GetProcessById(processID);
        if (GlobalVar.SourceWinForm.InvokeRequired)
        {

            GlobalVar.SourceWinForm.Invoke(new MethodInvoker(delegate { ProcessHandler.SetParent(proc.MainWindowHandle, GlobalVar.SourceWinForm.Handle); }));
        }
        else
        {
            ProcessHandler.SetParent(proc.MainWindowHandle, GlobalVar.SourceWinForm.Handle);
        }
    }

}

你可以看到我使用的功能:

[DllImport("user32.dll")]
public static extern IntPtr SetParent(IntPtr hwc, IntPtr hwp);
除了一件事,一切都很好。 例如,我在我的应用程序中搜索记事本应用程序。 所以它真的给了我记事本到我的应用程序窗口,但问题开始时 我在记事本中按下"格式 - >字体"它打开了一个新的记事本子窗口,这个子窗口,我的应用程序不是这个子窗口的父亲。

我如何捕捉整个过程?包括他的孩子(子)窗户?

2 个答案:

答案 0 :(得分:1)

你可以使用:

    [DllImport("user32.dll")]
    private static extern
        bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll")]
    private static extern
        bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
    [DllImport("user32.dll")]
    private static extern
        bool IsIconic(IntPtr hWnd);

然后

            // bring it to the foreground
            if (IsIconic(proc.MainWindowHandle))
                ShowWindowAsync(proc.MainWindowHandle, SW_RESTORE);
            SetForegroundWindow(proc.MainWindowHandle);

答案 1 :(得分:0)

解决方案: 首先,我想说评论是正确的,可以帮助其他人,所以请先阅读我的主要问题的评论。

但是如果你有特定的场景而你没有任何其他选择,你必须使用SetParent或其他类似的功能。 (请务必先阅读有关SetParent的内容,然后了解它的用量)

解决方案是将整个表单放到前台:

bool SetForegroundWindow(IntPtr hWnd);

这使得从您加载的主窗体继承的所有其他窗体都可以在主应用程序中看到它(这可以防止应用程序阻塞并遍历整个屏幕)