.net 在窗口可见后将其设置为模态
在窗口可见后,是否可以在模式窗口和非模式窗口之间切换 这就是我需要的。。。调用一个传递窗口句柄的方法并设置它是否为模态 如果可能,任何样品都会有很大帮助.net 在窗口可见后将其设置为模态,.net,c++,.net,C++,在窗口可见后,是否可以在模式窗口和非模式窗口之间切换 这就是我需要的。。。调用一个传递窗口句柄的方法并设置它是否为模态 如果可能,任何样品都会有很大帮助 .NET、C++等 谢谢 编辑: 为什么? 在本例中,我使用TWAIN扫描图像,“某些”数据源不会将其对话框显示为模态,即使我将其设置为模态,如果它不是模态,用户可能会弄乱背景窗口…您不能使用标准WinAPI执行此操作,我相当肯定您不能使用.NET framework执行此操作。您可以通过创建自己的消息泵例程来伪造它,该例程在从非模态切换到模
.NET、C++等 谢谢
编辑: 为什么?在本例中,我使用TWAIN扫描图像,“某些”数据源不会将其对话框显示为模态,即使我将其设置为模态,如果它不是模态,用户可能会弄乱背景窗口…您不能使用标准WinAPI执行此操作,我相当肯定您不能使用.NET framework执行此操作。您可以通过创建自己的消息泵例程来伪造它,该例程在从非模态切换到模态时被调用。
然而,听起来这是对错误问题的回答。你能解释一下为什么需要它在模态和非模态之间切换吗?对于.NET框架,我知道没有办法实现这种行为。在.NET中创建非模态或模态表单的方法是分别通过或方法来显示它
我不明白这样一个事实,你需要显示它非模态,然后再使它模态。你想完成什么?也许进一步的细节可以帮助我们帮助您,或者找到另一种方法,让您找到更好的解决方案,我希望。我想知道为什么OP会问这个问题,但这让我思考起来。我有一些东西可能是找到答案的开始 我创建了两个表单:Form1和Form2。Form1有一个按钮;Form2有一个文本框 我为Form1尝试了以下代码:
private void button_Click(object sender, EventArgs e)
{
form2.Show(this);
System.Threading.Thread thread = new System.Threading.Thread(showModal);
thread.Start();
}
private void showModal()
{
System.Threading.Thread.Sleep(2000);
form2.Visible = false;
form2.ShowDialog(this);
}
单击Form1上的按钮时,Form2显示为非模式框;它等待两秒钟;然后它隐藏Form2,然后将其显示为模态框。如果我在Form2切换之前输入它的文本框,文本将被保留。但是,当我单击Form2右上角的x时,我无法关闭它。由于它是模态的,我必须通过任务管理器终止程序以停止它。窗口模态主要由窗口句柄所有权驱动。禁用父窗口和设置本地消息循环是次要的工件 将模式窗口句柄的所有者设置为应用程序主窗口会创建这样的行为,即单击主窗口会将焦点发送到模式子窗口。如果所有者设置不正确,则在显示“模态”窗口时可以聚焦主窗口,这不是模态行为 我似乎隐约记得,您还需要禁用owner窗口,以防止在模式窗口处于活动状态时鼠标单击owner窗口上的按钮或选择菜单 模态窗口通常也与本地消息循环相关联,但这与窗口的模态UI行为关系不大,而与执行代码的模态状态有关。在Form.ShowDialog()内运行本地消息循环可使函数调用与模式窗口生存期同步-它可防止函数在模式窗口关闭之前返回调用方 创建子窗口句柄时,设置窗口句柄的所有者只能是一个。子窗口句柄存在后,无法更改所有者。请参阅MSDN上的 因此,您不能简单地翻转开关,使非模态窗口成为模态窗口 最好的办法是销毁窗口句柄,并与所需的所有者一起重新创建它。这可以在很少或没有屏幕闪烁的情况下完成,但更大的问题是在窗口上保留子控件的任何本地状态(编辑框中的文本、复选框状态等)。销毁窗口将丢失子窗口中的任何状态信息,因此您需要确保首先提取所有状态,然后重新创建窗口句柄,然后恢复子窗口数据