在另一个进程的顶部显示窗体模态

本文关键字:显示 窗体 模态 顶部 另一个 进程 | 更新日期: 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