3

好的,所以很多人都以一种或另一种方式问过这个问题,但是除了在调用孩子时传递父对象之外似乎没有很多答案。问题是,我无权访问父代码。

这是我的情况。

一些我无法访问的代码,我只是使用了 dll(父表单),在我的代码(子表单)中调用了一个函数。

我的函数调用需要父表单作为参数之一的第 3 方 SDK(不是那么重要)。此外,我无法访问第 3 方代码,只能通过一些 c++ 库。

我的子窗体能否认识它的父级,或者它注定要成为孤儿?

4

4 回答 4

3

最一般的情况下(因为您的表单位于 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;
于 2013-09-02T14:02:51.317 回答
2

也许我错过了一些东西,但你可以使用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

于 2013-09-02T13:59:03.923 回答
0

您的表格是否出现在另一个表格的顶部?试试Form.Owner属性。

您确定要这样做吗?您没有机会访问父表单可能有充分的理由。注意不要通过规避此限制来破坏框架或模式。

于 2013-09-02T13:59:13.083 回答
0

最好(为了您的心理健康)将所有需要的信息从父表单传递给孩子的表单,这样您只需以一种方式思考(父表单将一些信息传递给孩子,孩子将信息+更多信息传递给下一个孩子等等)

做一个依赖于其他表单的表单/类称为硬耦合,它是维护软件的一个问题。

于 2013-09-02T14:02:30.130 回答