好的,所以很多人都以一种或另一种方式问过这个问题,但是除了在调用孩子时传递父对象之外似乎没有很多答案。问题是,我无权访问父代码。
这是我的情况。
一些我无法访问的代码,我只是使用了 dll(父表单),在我的代码(子表单)中调用了一个函数。
我的函数调用需要父表单作为参数之一的第 3 方 SDK(不是那么重要)。此外,我无法访问第 3 方代码,只能通过一些 c++ 库。
我的子窗体能否认识它的父级,或者它注定要成为孤儿?
在最一般的情况下(因为您的表单位于 dll 中的某个位置,并且您必须将父表单传递给第 3 方软件)-WinAPI-您可以使用GetParent
函数检索父窗口句柄
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633510(v=vs.85).aspx
像这样的东西:
[DllImport("user32.dll",
EntryPoint = "GetParent",
CharSet = CharSet.Auto)]
internal static extern IntPtr GetParent(IntPtr hWnd);
...
IntPtr parentHandle = GetParent(myForm.Handle); // <- If you have a form
...
IntPtr myFormHandle = ...
IntPtr myFormParentHandle = GetParent(myFormHandle); // <- If you have WHND only
// If there's a .net form with myFormParentHandle Handle you can retrieve it
// Otherwise (e.g. form is not a .net one) you get null
Form parentForm = Control.FromHandle(myFormParentHandle) as Form;
也许我错过了一些东西,但你可以使用ContainerControl.ParentForm
var parent = myForm.ParentForm;
或者(如果您实际上没有要询问的表单,而是有一个控件):
var parent = myForm.Parent;
请参阅http://msdn.microsoft.com/en-us/library/system.windows.forms.control.parent.aspx
然后该父级的 Windows API 句柄将是:
IntPtr handle = parent.Handle;
您可以将其传递给您的 3rd 方 SDK。
请参阅http://msdn.microsoft.com/en-us/library/system.windows.forms.control.handle.aspx
如果您需要检查父级是否真的是一个表单:
Form form = myForm.Parent as Form;
if (form != null)
// Do something with form.
但就像人们说的:你应该能够使用myForm.ParentForm
您的表格是否出现在另一个表格的顶部?试试Form.Owner属性。
您确定要这样做吗?您没有机会访问父表单可能有充分的理由。注意不要通过规避此限制来破坏框架或模式。
最好(为了您的心理健康)将所有需要的信息从父表单传递给孩子的表单,这样您只需以一种方式思考(父表单将一些信息传递给孩子,孩子将信息+更多信息传递给下一个孩子等等)
做一个依赖于其他表单的表单/类称为硬耦合,它是维护软件的一个问题。