3

我想在我的 Windows 窗体应用程序中打开进程。

例如,我希望当用户按下其中一个 Windows 窗体容器中的按钮时,mstsc.exe 将打开。

如果他按下按钮,它将在另一个容器上打开 IE,

[DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
       private void button1_Click(object sender, EventArgs e)
    {
        Process p = Process.Start("mstsc.exe", @"c:\VPN4.rdp");
        Thread.Sleep(3000);
        p.StartInfo.CreateNoWindow = true;    // new
        SetParent(p.MainWindowHandle, this.panel1.Handle);
        p.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;   //new

    }

它打开进程,但不是以 Windows 形式,,,

4

2 回答 2

6

您可以启动另一个进程,并将它的窗口放在您自己的窗口中。

尝试使用您的表单句柄而不是面板。这是一个简短的例子

private void toolStripButton1_Click(object sender, EventArgs e)
{
  ProcessStartInfo info = new ProcessStartInfo();
  info.FileName = "notepad";
  info.UseShellExecute = true;
  var process = Process.Start(info);

  Thread.Sleep(2000);

  SetParent(process.MainWindowHandle, this.Handle);
}

至于原始问题的具体问题,我猜这是由于远程桌面打开其他窗口以供应用程序工作,而 MainWindowHandle 不是您所追求的。

尝试在 windows API 中使用 FindWindowEx 来搜索正确的窗口。如果您按进程 ID 和标题搜索,您应该找到正确的。Stackoverflow 和 google 有大量的信息。只需搜索“C# FindWindowEx”

于 2012-05-05T05:03:56.803 回答
1
ProcessStartInfo info = new ProcessStartInfo();
info.FileName = "notepad";
info.UseShellExecute = true;
Process.Start(info);
于 2012-05-03T15:41:25.387 回答