在另一个进程的顶部显示窗体模态
本文关键字:显示 窗体 模态 顶部 另一个 进程 | 更新日期: 2023-09-27 18:27:58
我尝试过这样做,最终得到了以下代码;
var proc = Process.GetProcesses().Where(x => x.ProcessName == "notepad").First();
IWin32Window w = Control.FromHandle(proc.MainWindowHandle);
using (Form2 frm = new Form2())
{
frm.ShowDialog(w);
}
然而,出于某种原因,这并没有将表单显示为"记事本"上的模态,这是为什么?我想要实现的是:能够在记事本上显示模态。谢谢
Control.FromHandle
将为在另一个进程中创建的窗口返回null。
因此,当调用frm.ShowDialog(w);
时,您实际上传递的是null
,因此您的表单不是Notepad's window
的父级。
public class Win32WindowWrapper : IWin32Window
{
private IntPtr handle;
public Win32WindowWrapper(IntPtr handle)
{
this.handle = handle;
}
public IntPtr Handle
{
get { return handle; }
}
}
using (Form2 frm = new Form2())
{
frm.ShowDialog(new Win32WindowWrapper(proc.MainWindowHandle));
}
这应该工作
您需要将IntPtr转换为IWin32Window,但要做到这一点,您必须使用包装器。以下是示例源代码:
public class WindowWrapper : System.Windows.Forms.IWin32Window
{
public WindowWrapper(IntPtr handle)
{
_hwnd = handle;
}
public IntPtr Handle
{
get { return _hwnd; }
}
private IntPtr _hwnd;
}
Process[] procs = Process.GetProcessesByName("Notepad");
if (procs.Length != 0)
{
IntPtr hwnd = procs[0].MainWindowHandle;
MessageBox.Show(new WindowWrapper(hwnd), "Hello World!");
}
else
MessageBox.Show("Notepad is not running.");
来源:http://ryanfarley.com/blog/archive/2004/03/23/465.aspx