Используя 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](https://i.stack.imgur.com/skjdw.png)