使用时System.Windows.Forms.ShowDialog(IWin32Window)
,我应该能够传递一个IWin32Window
代表任何窗口句柄并且它是否相对于该窗口是模态的?
作为 Internet Explorer 7 扩展的一部分,我尝试打开一个与 Internet Explorer 选项卡相关的窗口模式。它不是当前选定的选项卡,但我可以获取该选项卡的 hwnd OK。但是,当我将其传递给 ShowDialog 时,会显示我的表单,但它对于任何内容都不是模态的:我仍然可以在 Internet Explorer 中执行操作,包括在应该是所有者的选项卡中执行操作。我的表单显示为浮动在 Internet Explorer 窗口上方,并且始终位于顶部,因此它不像只是作为普通表单打开,但它的模式不正确。
Using Spy++ http://msdn.microsoft.com/en-us/library/aa264396%28v=vs.60%29.aspx,我可以找到我的表单,并且它的所有者句柄设置正确。
这是否意味着出了问题,或者我做错了什么?如何使我的表单正确模式化?
仅供参考,我正在使用这个包装类来创建一个IWin32Window
from a hwnd
(谢谢Ryan! http://ryanfarley.com/blog/archive/2004/03/23/465.aspx):
/// <summary>
/// Wrapper class so that we can return an IWin32Window given a hwnd
/// </summary>
public class WindowWrapper : System.Windows.Forms.IWin32Window
{
public WindowWrapper(IntPtr handle)
{
_hwnd = handle;
}
public IntPtr Handle
{
get { return _hwnd; }
}
private IntPtr _hwnd;
}
更新:使用 Internet Explorer 7 和 .NET 2.0
更新:使用 Spy++ 及其公开的句柄进行更多操作,我发现如果我使用不同的hwnd
然后我可以使我的窗口成为选项卡的模式:
我正在使用选项卡hwnd
正如建议的IWebBrowser2.HWND 文档 http://msdn.microsoft.com/en-us/library/aa752126(VS.85).aspx,在 Spy++ 中显示为类TabWindowClass
。它有一个班级的孩子Shell DocObject View
,它有一个 Internet_Explorer_Server 的子级。如果我使用hwnd
of the Internet Explorer_Server
那么它就可以正常工作,例如,当我用鼠标单击其他选项卡时,Internet Explorer 会正常反应。当我用鼠标单击感兴趣的选项卡时,它会播放 windows d'oh 声音,但不会执行任何操作。
我还不知道如何以编程方式获取 Internet_Explorer_Serverhwnd
,但应该是可以的。
另外,就其价值而言,在使用其他窗口句柄时,我通常能够使我的表单成为其他应用程序和对话框的模式。所以我想我的问题的答案是“很多但不是所有句柄”......可能这取决于应用程序?
更新:另一个旁注:我想让我的表单模式化到选项卡而不是整个窗口的最初原因是,当打开一个MessageBox
从我的表格中,以所有者身份传递表格,MessageBox
不会总是在我的表格上方打开。如果刚刚打开了新的 Internet Explorer 标签但未处于活动状态,则MessageBox
将被隐藏并且该选项卡将开始闪烁。但是,由于 Internet Explorer 在我的表单打开模式下被禁用,因此无法切换到该选项卡,因此 Internet Explorer 将被冻结。我认为打开选项卡的表单模式可以解决这个问题,但我发现另一个解决方案是避免使用MessageBox
:如果我使用第二种形式并且ShowDialog(this)
从我的第一个表格开始,第二个表格正确地向前打开。所以看来Form.ShowDialog()
效果比MessageBox.Show()
在某些情况下。更多讨论在模式对话框和消息框的问题 http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/df0fe7f2-0153-47d9-b18f-266d57ab7909.