检测新应用并在面板中运行

时间:2018-06-30 06:49:33

标签: c# .net winforms detection

我正在创建在面板内运行另一个应用程序的应用程序。

.symtab

但是问题是,有时app.exe(我知道何时)会创建一个新窗口作为新应用程序。我想将此新窗口添加到新面板中。

/lib/ld-linux-armhf.so.3

感谢一切可以推动我正确前进的方法

1 个答案:

答案 0 :(得分:3)

使用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