如何访问父窗体

本文关键字:窗体 访问 何访问 | 更新日期: 2023-09-27 18:29:58

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

这是我的情况。

有些代码我无法访问,我只能使用dll(父窗体),调用代码中的函数(子窗体)。

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

我的孩子会认识自己的父母吗?还是注定要成为孤儿?

如何访问父窗体

中,最常见的情况是(因为您的表单位于dll中,您必须将父表单传递到第三方软件中)-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;

您可以将其传递给您的第三方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属性。

你绝对确定你想这么做吗?您没有机会访问父窗体可能是有充分理由的。请注意,您不要绕过此限制而破坏框架或模式。

最好(为了你的心智健全)从父窗体向子窗体传递所有需要的信息,这样你只需要用一种方式思考(父窗体将一些信息传递给子窗体,子窗体将信息+更多信息传递给下一个子窗体,依此类推)

执行依赖于其他表单的表单/类被称为硬耦合,这是维护软件的问题。