在另一个进程的顶部显示表单模式

时间:2013-08-17 11:38:59

标签: c#

我尝试过这样做,最后得到以下代码;

        var proc = Process.GetProcesses().Where(x => x.ProcessName == "notepad").First();
        IWin32Window w = Control.FromHandle(proc.MainWindowHandle);

        using (Form2 frm = new Form2())
        {
            frm.ShowDialog(w);
        }

然而,由于某种原因,这并不会将表格显示为“记事本”之上的模态,为什么会这样? 我想要实现的是:能够在记事本上显示模态。谢谢!

2 个答案:

答案 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.");

来源:http://ryanfarley.com/blog/archive/2004/03/23/465.aspx