我正在创建在面板内运行另一个应用程序的应用程序。
.symtab
但是问题是,有时app.exe(我知道何时)会创建一个新窗口作为新应用程序。我想将此新窗口添加到新面板中。
/lib/ld-linux-armhf.so.3
感谢一切可以推动我正确前进的方法
答案 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);
}
}