.net – 在可见之后将窗口设置为模态

可见之后在模态和非模态之间切换窗口是否可行?

这就是我需要的…调用一个方法传递窗口句柄并设置我是否希望它是模态的.

如果可能,任何样品都会有很大帮助!

.net,c等

谢谢!

编辑:
为什么?
在这种情况下,我使用TWAIN扫描图像,“一些”数据源不会将其对话框显示为模态,即使我将其设置为这样做,如果它不是模态,则用户可能会弄​​乱背景窗口…

最佳答案 窗口模态主要由窗口句柄所有权驱动.禁用父窗口并设置本地消息循环是次要工件.

将模态窗口句柄的所有者设置为应用程序主窗口会创建单击主窗口将焦点发送到模态子窗口的行为.如果没有正确设置所有者,主窗口可以在显示“模态”窗口时聚焦,这不是模态行为.

我似乎模糊地回忆起你还需要禁用所有者窗口,以防止鼠标点击按钮或在模态窗口处于活动状态时选择所有者窗口上的菜单.

模态窗口通常也与本地消息循环相关联,但这与窗口的模态UI行为以及与执行代码的模态状态有关的一切都没有关系.在Form.ShowDialog()中运行本地消息循环使函数调用与模态窗口生命周期同步 – 它阻止函数返回到调用者,直到模式窗口关闭.

在创建子窗口句柄时,设置窗口句柄的所有者只能是一个.子窗口句柄存在后,无法更改所有者.请参阅Owned Windows上的MSDN

因此,您不能简单地翻转开关并制作非模态窗口模态.

您最好的选择是销毁窗口手柄并使用所需的所有者重新创建它.这可以在很少或没有屏幕闪烁的情况下完成,但更大的问题是保留窗口上的子控件的任何本地状态(编辑框中的文本,复选框状态等).销毁窗口将丢失子窗口中的任何状态信息,因此您需要确保首先提取所有状态,然后重新创建窗口句柄,然后恢复子窗口数据.

点赞