3

Windowsフォームアプリケーション内でプロセスを開きたいです。

たとえば、ユーザーが Windows フォーム コンテナーの 1 つでボタンを押すと、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 に答える