Form.ShowDialog(IWin32Window) 应该与任何窗口句柄一起使用吗?

2024-02-29

使用时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.


ShowDialog() 做了两件重要的事情。它开始泵送消息循环,以便它以模态方式作用于调用代码。它还通过 EnableWindow(false) API 调用禁用应用程序中的任何其他窗口。后者是你的情况没有发生的情况。考虑到需要禁用的窗口不是 WF 窗口,这并不完全令人惊讶。

您可能需要自己调用EnableWindow()。请务必在对话框关闭之前重新启用它,否则 Windows 将寻找另一个应用程序的窗口来给予焦点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Form.ShowDialog(IWin32Window) 应该与任何窗口句柄一起使用吗? 的相关文章

  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • C++ 子字符串返回错误结果

    我有这个字符串 std string date 20121020 我正在做 std cout lt lt Date lt lt date lt lt n std cout lt lt Year lt lt date substr 0 4 l
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • .Net应用程序设置路径

    默认情况下 Windows 应用程序设置保存在该目录中 USERPROFILE Local Settings Application Data
  • 在.rdlc报告的底部设置一个文本框

    我在 rdlc 报告中使用 tablix 有一个文本框 其中包含文本 签名 我想将此文本框放置在报告最后一页的底部 就在页脚之前 我已经用谷歌搜索了这个解决方案 但没有找到满意的结果 我的环境是VS2010 framework 4 0 有什
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 有没有办法禁用 .NET 标签的“双击复制”功能?

    这真的很烦人 我使用标签作为列表项用户控件的一部分 用户可以单击它来选择列表项 然后双击它来重命名它 但是 如果剪贴板中有名称 双击标签会将其替换为标签文本 我还检查了应用程序中的其他标签 双击它们也会将其复制到剪贴板 我没有在这个程序中编
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐