Определите новое приложение и запустите его на панели - PullRequest
0 голосов
/ 30 июня 2018

Я создаю приложение, которое запускает другое приложение внутри панели.

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

public Form3() {
    InitializeComponent();

}

private void button1_Click(object sender, EventArgs e) {
    Process p = Process.Start(@"path\app.exe");
    Thread.Sleep(200); // Allow the process to open it's window
    SetParent(p.MainWindowHandle, panel1.Handle);
}

Но проблема в том, что app.exe иногда (я знаю, когда) создает новое окно как новое приложение. Я хочу добавить это новое окно в новую панель.

private Process GetProcess() {
    //do some magic stuff and find actually running app
    return NewAppProcess;
}

private void button2_Click(object sender, EventArgs e) {
    Process p = GetProcess();
    SetParent(p.MainWindowHandle, panel2.Handle);
}

Спасибо за все, что может подтолкнуть меня на правильный путь

1 Ответ

0 голосов
/ 30 июня 2018

Используя ManagementEventWatcher, вы можете смотреть Win32_ProcessStartTrace, чтобы получить событие при запуске нового процесса.

Пример

В этом примере я показываю, как вы можете наблюдать начало mspaint.exe и добавление его как дочернего элемента Panel в вашей форме. Для этого добавьте ссылку на System.Management dll в ваш проект, а затем используйте следующий код.

Примечание 1: Наблюдатель работает не очень быстро, и вы, вероятно, видите, что окно открывается на рабочем столе и затем сидит на панели.

Примечание 2: Это пример и показ горячей, чтобы сделать это с mspaint.exe. Если у вас возникли проблемы с применением решения на вашем реальном app.exe, вам нужно специально спросить о решении для вашего app.exe.

Примечание 3: Убедитесь, что вы работаете как администратор.

using System.Management;
using System.Runtime.InteropServices;
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    [DllImport("user32.dll")]
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

    ManagementEventWatcher watcher;
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        watcher = new ManagementEventWatcher(
            "Select * From Win32_ProcessStartTrace Where ProcessName = 'mspaint.exe'");
        watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
        watcher.Start();
    }
    void watcher_EventArrived(object sender, EventArrivedEventArgs e)
    {
        var id = (UInt32)e.NewEvent["ProcessID"];
        var process = System.Diagnostics.Process.GetProcessById((int)id);
        this.Invoke(new MethodInvoker(() => {
            SetParent(process.MainWindowHandle, panel1.Handle);
        }));
    }
    protected override void OnFormClosed(FormClosedEventArgs e)
    {
        watcher.Stop();
        watcher.Dispose();
        base.OnFormClosed(e);
    }
}

enter image description here

...