如何在.NET 1.1中显示无模式拥有的对话框

时间:2011-08-10 09:44:36

标签: c# .net winforms

我需要在 .NET 1.1 中显示无模式对话框。以下代码适用于.NET 2.0或更高版本:

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetActiveWindow();

private void ShowModelessOwnedDialog()
{
   IntPtr wHnd = GetActiveWindow();
   NativeWindow parent = NativeWindow.FromHandle(wHnd);
   MyForm f = new MyForm();
   f.Show(parent);
}

.NET 2.0中的调用Show(IWin32Window)introduced。你知道怎么欺骗这段代码在 .NET 1.1 中工作吗?也许是任何无人管理的电话?

4 个答案:

答案 0 :(得分:2)

Here是1999年的一篇文章,展示了如何致电SetWindowLong来实现这一目标。我对你不得不使用.NET版本1表示哀悼。

答案 1 :(得分:2)

这是在.NET 1.1中将所有者分配给托管表单的方法。我从@Dave Markle答案和.NET 2.0的Show(IWin32Window)实现中提取了以下代码。

    private void AssignOwner()
    {
        AssignOwner(this, GetActiveWindow());
    }

    private void AssignOwner(Form f, IntPtr ownerHandle)
    {
        if (ownerHandle == IntPtr.Zero) return;

        NativeWindow parent = NativeWindow.FromHandle(ownerHandle);

        GetWindowLong(new HandleRef(f, f.Handle), -8);
        SetWindowLong(new HandleRef(f, f.Handle), -8, new HandleRef(parent, ownerHandle));
    }

    public static IntPtr GetWindowLong(HandleRef hWnd, int nIndex)
    {
        if (IntPtr.Size == 4)
        {
            return GetWindowLong32(hWnd, nIndex);
        }
        return GetWindowLongPtr64(hWnd, nIndex);
    }

    public static IntPtr SetWindowLong(HandleRef hWnd, int nIndex, HandleRef dwNewLong)
    {
        if (IntPtr.Size == 4)
        {
            return SetWindowLongPtr32(hWnd, nIndex, dwNewLong);
        }
        return SetWindowLongPtr64(hWnd, nIndex, dwNewLong);
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    private static extern IntPtr GetActiveWindow();
    [DllImport("user32.dll", EntryPoint = "GetWindowLong", CharSet = CharSet.Auto)]
    public static extern IntPtr GetWindowLong32(HandleRef hWnd, int nIndex);
    [DllImport("user32.dll", EntryPoint = "GetWindowLongPtr", CharSet = CharSet.Auto)]
    public static extern IntPtr GetWindowLongPtr64(HandleRef hWnd, int nIndex);
    [DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
    public static extern IntPtr SetWindowLongPtr32(HandleRef hWnd, int nIndex, HandleRef dwNewLong);
    [DllImport("user32.dll", EntryPoint = "SetWindowLongPtr", CharSet = CharSet.Auto)]
    public static extern IntPtr SetWindowLongPtr64(HandleRef hWnd, int nIndex, HandleRef dwNewLong);

答案 2 :(得分:1)

MSDN states创建窗口所有权后无法转移 因为创建窗口发生在Form构造函数中,所以这给您带来了问题。

然而Raymond Chen says

  

所有权是与顶级窗口相关的概念。顶级窗口可以选择包含所有者(在您致电CreateWindowEx时也会指定),可以通过我的演讲中描述的复杂机制进行更改

我认为有问题的谈话是from PDC 05,但我无法确定。

你试过SetParent了吗?

static extern void SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

答案 3 :(得分:0)

在.net 1.1中有一个MessageBox.Show overload和IWin32Window

http://msdn.microsoft.com/en-us/library/aa335416(v=VS.71).aspx

public static DialogResult Show(
 IWin32Window owner,
 string text,
 string caption,
 MessageBoxButtons buttons,
 MessageBoxIcon icon,
 MessageBoxDefaultButton defaultButton
);

这是获得IWin2Window here

的例子