如何访问父窗体
本文关键字:窗体 访问 何访问 | 更新日期: 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属性。
你绝对确定你想这么做吗?您没有机会访问父窗体可能是有充分理由的。请注意,您不要绕过此限制而破坏框架或模式。
最好(为了你的心智健全)从父窗体向子窗体传递所有需要的信息,这样你只需要用一种方式思考(父窗体将一些信息传递给子窗体,子窗体将信息+更多信息传递给下一个子窗体,依此类推)
执行依赖于其他表单的表单/类被称为硬耦合,这是维护软件的问题。