繁体   English   中英

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

[英]How to show modeless owned dialog in .NET 1.1

我需要在.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);
}

调用Show(IWin32Window)是在 .NET 2.0 中引入的。 你知道如何欺骗这个代码在.NET 1.1中工作吗? 也许有任何非托管电话?

是 1999 年的一篇文章,展示了如何调用SetWindowLong来完成此操作。 我对您不得不使用 .NET 版本 1 表示哀悼。

这是在 .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);

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

然而,Raymond Chen

所有权是一个与顶层 windows 相关的概念。 顶级 window 可以选择拥有所有者,在调用CreateWindowEx时也会指定所有者,并且可以通过我的演讲中描述的复杂机制进行更改

我认为有问题的谈话来自 PDC 05 ,但我不能确定。

你试过SetParent吗?

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

.net 1.1 中有一个MessageBox.Show 过载和 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 的示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM