【问题标题】:Running exe inside WinForm Project Tab在 WinForm 项目选项卡中运行 exe
【发布时间】:2013-03-13 18:37:41
【问题描述】:

我有兴趣使用我正在编写的 winform 应用程序执行以下操作,以便在 Visual Studios 2010 IDE 中以 c# 格式在选项卡中打开 .exe。

我目前可以使用以下代码通过在所需选项卡中单击按钮来打开程序:

        string str = @"-INSERT FILEPATH HERE-";//took file path out as i have a few exes i'm wanting to add. 
        Process process = new Process();
        process.StartInfo.FileName = str;
        process.Start();

现在我怎样才能让它在我的winform中以选项卡或选项卡的形式打开?我愿意接受任何一种情况的建议。

已解决:

using System.Runtime.InteropServices;
    using System.Threading;
    [DllImport("user32.dll", SetLastError = true)]
    private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
    [DllImport("user32.dll", SetLastError = true)]
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

   public GUI()
    {
        // Initialize form fieds
        InitializeComponent();
        openProgram()
    }
    private void openProgram()
    {

        process.StartInfo.FileName = "-filepathhere-";

        process.Start();

        IntPtr ptr = IntPtr.Zero;
        while ((ptr = process.MainWindowHandle) == IntPtr.Zero) ;
        SetParent(process.MainWindowHandle, trackerPanel.Handle);
        MoveWindow(process.MainWindowHandle, 0, 0, this.Width - 90, this.Height, true);

    }

【问题讨论】:

  • 您的意思是在winforms 中使用TabControl 吗?
  • 是的,我希望它作为选项卡在选项卡控件中。
  • 所以您尝试在 TabControl 中打开记事本,您可以尝试使用 richTextBox 来完成该任务。
  • 不是记事本,但是需要在 tabcontrol 中打开程序。
  • 嗨@PhoenixLament,你自己的答案看起来很棒吗?您能否提供更多详细信息,我将代码粘贴到我的表单上,但出现与命名空间相关的错误。我已经导入了 user32.dll,但是和你一样,不能在面板内实例化任何应用程序。谢谢

标签: c# winforms process tabs exe


【解决方案1】:

您可以使用 SetParent api 来设置可执行文件窗口的父级。将面板添加到您的 TabControl 并使用下面的代码将可执行窗口的父级分配给面板的父级。

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

private void button2_Click(object sender, EventArgs e)
{
    var process = new Process();
    process.StartInfo.FileName = "notepad.exe";
    process.Start();
    SetParent(process.MainWindowHandle, panel1.Handle);
}

要从面板中删除窗口,请使用相同的代码,但将父句柄设置为 IntPtr.Zero

SetParent(process.MainWindowHandle, IntPtr.Zero);

【讨论】:

  • 提供的代码仍将记事本作为新窗口打开。仍在尝试在 tabcontrol 的面板中获取它。
猜你喜欢
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多