我需要在 .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 中工作吗?也许是任何无人管理的电话?
答案 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
的例子