Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何访问父窗体?_C#_Winforms - Fatal编程技术网

C# 如何访问父窗体?

C# 如何访问父窗体?,c#,winforms,C#,Winforms,好的,很多人都以这样或那样的方式问过这个问题,但是除了调用孩子时传递父对象之外,似乎没有太多的答案。问题是,我没有访问父代码的权限 这是我的情况 有些代码我没有访问权限,我只是使用dll(父窗体),调用代码中的函数(子窗体) 我的函数调用第三方SDK(不太重要),它需要父窗体作为参数之一。此外,我还没有访问第三方代码,只有通过一些C++库。 我的孩子形态能认识它的父母吗,或者它注定是孤儿吗?也许我遗漏了什么,但你可以使用 或者(如果您实际上没有要查询的表单,但有一个控件): 看 然后,该父级的W

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

这是我的情况

有些代码我没有访问权限,我只是使用dll(父窗体),调用代码中的函数(子窗体)

我的函数调用第三方SDK(不太重要),它需要父窗体作为参数之一。此外,我还没有访问第三方代码,只有通过一些C++库。
我的孩子形态能认识它的父母吗,或者它注定是孤儿吗?

也许我遗漏了什么,但你可以使用

或者(如果您实际上没有要查询的表单,但有一个控件):

然后,该父级的Windows API句柄将为:

IntPtr handle = parent.Handle;
您可以将其传递给第三方SDK

如果需要检查父级是否真的是表单:

Form form = myForm.Parent as Form;

if (form != null)
    // Do something with form.

但是就像人们说的那样:你应该能够使用myForm.ParentForm,你的表单会出现在另一个表单之上吗?试试这个属性

你真的确定要这么做吗?您可能没有机会访问父窗体,这是一个很好的理由。注意不要绕过这一限制而破坏框架或模式。

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

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

在最常见的情况下(因为您的表单位于dll中的某个位置,您必须将父表单传递到第三方软件)-WinAPI-您可以使用
GetParent
函数检索父窗口句柄

诸如此类:

[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;
[DllImport(“user32.dll”,
EntryPoint=“GetParent”,
CharSet=CharSet.Auto)]
内部静态外部IntPtr GetParent(IntPtr hWnd);
...

IntPtr parentHandle=GetParent(myForm.Handle);//是否
ParentForm
属性对您不起作用?或者怎么样?您所说的
父窗体
到底是什么意思?如果您的子窗体有父窗体,父窗体将包含它,这意味着子窗体不能移出
父窗体的
范围
。我想您指的是
所有者窗体
@KingKing有一个很好的观点。您所关注的是表单的容器,还是所有者表单(它将是一个不同的窗口,并且始终显示在所属表单的后面)这看起来可能是票证。是否可以将此intptr转换回其对象?即,我是否可以获取父窗体?@user1934821 Yes
Form parent=(Form)Control.FromHandle(parentHandle)
TopLevel
为真时,表单的
Parent
ParentForm
无效。默认情况下
TopLevel
为真。我想你的意思是
Owner
@SriramSakthivel OP要求的是父表单,而不是所有者?你能详细说明什么是父表单吗?它是如何为父表单的?我还不清楚gh.
Parent表单
没有意义不清楚。这对于
mdipparent有意义
我遗漏了什么吗?@UweKeim安全需求差异并不重要。主要区别在于
FindForm()
在窗体没有父级时不会返回null。如果您需要知道窗体没有父级,则应调用
ParentForm
,而不是
FindForm()
。是的,将一个旧系统与另一个旧系统集成的缺点是。:(这不是一个选项,因为我无法访问父级代码
Form form = myForm.Parent as Form;

if (form != null)
    // Do something with form.
[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;