0

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

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

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

但是,由于某种原因,这不会将表单显示为“记事本”顶部的模式,这是为什么呢?我想要实现的是:能够在记事本上显示模式。谢谢!

4

2 回答 2

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));
}

这应该工作

于 2013-08-17T11:47:48.970 回答
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

于 2013-08-17T11:54:44.657 回答