我可以使用hwnd/NativeWindow来设置我的WinForms表单所有者的行为吗?我的应用程序是vb6可执行文件,但系统中一些较新的窗体是用C#编写的。我希望能够使用主应用程序窗口的句柄设置C#窗体的所有者属性,以便在我的应用程序和其他应用程序之间来回切换时,对话框保持在顶部。我可以获得主应用程序窗口的hwnd。我不确定我能从那里做什么?2008年10月20日17:06更新:斯科特,感谢您的回复。我忽略了Show/ShowDialog方法参数不是Form类型——我只查看Owner属性。我稍微修改了我正在使用的代码-我们有一个通常加载我们的表单并调用ShowDialog的组件。我的代码如下所示:FormlaunchTarget=FormFactory.GetForm(xxx);//通用表单加载器的伪代码launchTarget.StartPosition=FormStartPosition.CenterParent;IWin32WindowparentWindow=GetWindowFromHwnd(hwnd);launchTarget.ShowDialog(parentWindow);是代码的方法包装版本:privateIWin32WindowGetWindowFromHost(inthwnd){IWin32Windowwindow=null;IntPtrhandle=newIntPtr(hwnd);尝试{NativeWindownativeWindow=newNativeWindow();nativeWindow.AssignHandle(句柄);窗口=nativeWindow;}最后{handle=IntPtr.Zero;}返回窗口;}不幸的是,这不是我所希望的。表单以模态方式显示,但是当我离开并返回到父窗口时,它没有显示在正确的位置,也没有显示在顶部。我们的模式没有在任务栏中显示任务,因此窗口似乎“消失”了(尽管它仍然存在于alt-tab窗口列表中)。这向我表明我可能不合适。如果您有任何其他建议,请回复。再次感谢。更新于2008年11月10日16:25后续说明-如果您将其分解为try/finally中的方法调用,就像在Scott的第二篇文章中那样,finally块中的调用应该是:parentWindow.ReleaseHandle();所以您正在从VB6调用C#Windows窗体类,这意味着您可能正在使用Show()或ShowDialog(),对吗?这两种方法都采用IWin32Window参数,该参数仅定义一个返回名为Handle的IntPtr属性的对象。所以...您需要向采用长参数的Windows窗体类添加一个重载构造函数(或ShowDialog方法),以便您可以将VB6hwnd传递给窗体。在C#代码中,您需要从hwnd创建一个IntPtr并将其分配给NativeWindow对象,将其作为所有者传递。像这样的东西应该可以工作,虽然它没有经过测试:尝试{NativeWindownativeWindow=newNativeWindow();nativeWindow.AssignHandle(句柄);返回this.ShowDialog(nativeWindow);}最后{handle=IntPtr.零;这对于评论来说太长了......我认为你遇到的问题是你包装我在ShowDialog重载中呈现的代码的方式。如果您遵循GetWindowFromHost代码,它会执行以下操作:从给定的hwnd创建一个新的IntPtr。创建一个新的NativeWindow对象并将其句柄指定为IntPtr。将IntPtr(在finally块中)设置为IntPtr.Zero。我认为这是最终阻碍你的问题。在我的代码中,finally块将在调用this.ShowDialog(nativeWindow)完成后运行。此时,不再使用句柄(IntPtr)。在您的代码中,您返回一个IWin32Window,当您调用launchTarget.ShowDialog(parentWindow)时,它仍然应该持有对该IntPtr的引用,它持有一个引用launchTarget.ShowDialog(parentWindow)isIntPtr.Zero。尝试将您的代码更改为如下所示:privateNativeWindowGetWindowFromHost(inthwnd){IntPtrhandle=newIntPtr(hwnd);NativeWindownativeWindow=newNativeWindow();nativeWindow.AssignHandle(句柄);返回窗口;然后拨打电话将代码更改为如下所示:FormlaunchTarget=FormFactory.GetForm(xxx);//通用表单的伪代码loaderlaunchTarget.StartPosition=FormStartPosition.CenterParent;NativeWindowparentWindow=GetWindowFromHwnd(hwnd);尝试{launchTarget.ShowDialog(parentWindow);}最后{parentWindow.DestroyHandle();这些更改应该有效,但这是未经测试的。以上是C#学习教程:CanIusehwnd/NativeWindowtosetthebehaviorofmyWinFormsformowner?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
