我尝试过这样做,最后得到以下代码;
var proc = Process.GetProcesses().Where(x => x.ProcessName == "notepad").First();
IWin32Window w = Control.FromHandle(proc.MainWindowHandle);
using (Form2 frm = new Form2())
{
frm.ShowDialog(w);
}
然而,由于某种原因,这并不会将表格显示为“记事本”之上的模态,为什么会这样? 我想要实现的是:能够在记事本上显示模态。谢谢!
答案 0 :(得分:2)
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));
}
这应该有效
答案 1 :(得分:0)
您需要将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.");