当使用 System.Windows.Forms.ShowDialog(IWin32Window), 我应该能够通过在一个 IWin32Window 代表任何一窗口处理,并让它模式相对于为这一窗口?

作为一部分的一个互联网浏览器7扩展我试图打开一个窗口模式相对于互联网资源管理器卡。这不是目前选定的选项,但我可以得到的hwnd签确定。然而,当我通过这ShowDialog我的表示,但这不是模式相对于任何东西:我仍然可以做的事情,在互联网资源管理器,其中包括在卡,应该是所有者。我的表显示上面漂浮Internet Explorer窗户并保持在最前面,所以它不喜欢这只是开了一个正常形式,但这是不正确模式。

使用 间谍++, 我可以找到我的形式和它的主人处理是正确的设置。

这是不是意味着,出了问题,或者我做错了什么?我怎么做我的形成正确态?

仅供参考,我使用这个包装类创建一个 IWin32Window 从一个 hwnd (谢谢 Ryan!):

/// <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;
}

更新:使用互联网浏览器7&.网2.0

更新:玩多一些有间谍++和处理它暴露了,我发现,如果我使用一个不同的 hwnd 然后我可以做我的窗态标签:

我是使用标签的 hwnd 作为建议 IWebBrowser2.HWND医生, ,其在间谍++出现类 TabWindowClass.它有一个孩子的类 Shell DocObject View, ,其中有一个孩子的Internet_Explorer_Server.如果我用的 hwndInternet Explorer_Server 然后它的工作原理正确,例如,当我用鼠标点击的其他标签,"Internet Explorer"的反应。当我用鼠标点击的选项感兴趣,它起着windows d'oh的声音,不会做任何事情。

我还不知道如何通过程序获得Internet_Explorer_Server hwnd, 但这应该是可能的。

还有,为什么它的价值,同时与其他窗口处理我通常能够让我的形式模式的其他应用程序和对话。所以我想回答我的问题是许多但不是所有手柄...可能它取决于应用程序?

更新:另一个侧面注意:原因我想让我的形式模式的标签,而不是整个窗口是打开 MessageBox 从我的形式,传递的形式作为所有者, MessageBox 不会总是打在我的形式。如果一个新的互联网资源管理器卡刚刚被打开,但不那么活跃 MessageBox 会被隐藏和卡将开始闪烁。但是,由于互联网资源管理器已禁用我的形式开设模式也不可能切换到,tab,所以互联网资源管理器将被冻结。我以为是开我的形式模式的标签将会解决这个问题,但我已经找到另一解决办法是避免使用 MessageBox:如果我使用第二种形式和 ShowDialog(this) 从我第一的形式,然后在第二种形式的正确打开前面。因此它似乎 Form.ShowDialog()MessageBox.Show() 在一些情况。更多的讨论 问题模式的对话和消息框.

有帮助吗?

解决方案

您的代码是正确的。你很可能遇到了,虽然问题是,IE浏览器有关的选项卡的线程模型。我不知道确切的细节,但短版本是,每个标签页可以并且很可能是在不同的线程比其他选项卡上运行。

一个对话框的Modal'ness是特定于对话正在运行的线程。在其他线程UI将是在另一个线程模型对话框不受影响。这是完全有可能的,你都可以访问它运行的是标签在不同的线程这个原因。

其他提示

的ShowDialog()做两个重要的事情。它开始抽消息循环,因此模态起作用,并且调用代码。和禁止任何其他窗口与EnableWindow(假)API调用应用程序。后者是究竟是不是你的情况发生。并非完全出乎意料,考虑到需要被禁用的窗口不是WF窗口。

您可能需要调用EnableWindow()自己。一定要在对话框关闭或Windows将去打猎了另一个应用程序的窗口,将焦点放到之前重新启用它。

下面是瑞恩/ Rory的WindowWrapper代码更简明的版本:

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}

我从来没有尝试这从扩展IE,但是我有预感,IE可以不是“相对于”一个Win32风格模式窗口它确实使用window.open().从Javascript提出一个模式窗口相同的方式

你有没有测试对IE以外的东西这个代码,只是为了确认它的工作原理它应该用于其它应用程序的方式?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top