我有一个想要模态化的MessageBox的问题。
这是情况
用户从表单中选择xx
出现消息框
用户打开嵌入式软件键盘(内置的键盘,来自设备)
用户关闭键盘
MessageBox失去焦点(怎么办?应该是模态的!),主要形式显示在前台
该应用程序阻止,因为用户现在无法关闭MessageBox。
这是MessageBox的代码段。
MessageBox.Show("message", "caption", MessageBoxButtons.OK, MessageBoxIcon.Asterisk,
MessageBoxDefaultButton.Button1);
关于如何解决这个问题的任何想法?
最佳答案
在Windows CE下,这实际上是某种预期的行为(我并不是说这是正确的,只是预期的)。
当您单击桌面角落的SIP按钮时,整个应用程序将失去焦点,并且焦点将传递到任务栏。通过单击应用程序的任务栏按钮,您可以看到类似的“呆板”-MessageBox将失去焦点,即使按所有权限,您只应将焦点发送到已在运行的应用程序。
通过更改MessageBox调用,您可以看到它不是CF错误:
private void button1_Click(object sender, EventArgs e)
{
//MessageBox.Show("message", "caption", MessageBoxButtons.OK,
// MessageBoxIcon.Asterisk,
// MessageBoxDefaultButton.Button1);
MessageBoxCE(this.Handle, "message", "caption", 0);
}
// renamed to not collide with the Windows.Forms MessageBox class
[DllImport("coredll", EntryPoint="MessageBox")]
private static extern int MessageBoxCE(IntPtr hWnd, string lpText,
string lpCaption, int Type);
您会得到完全相同的行为。
不希望发生的一件事是父窗体出现在MessageBox上方。我刚刚在台式机上使用的基于ARM的CE 5.0设备上进行了测试,而MessageBox在CF和P / Invoke版本中均处于领先地位。
您是否可以使用一个非常基本的应用程序(即仅一种形式,一个按钮)来再现这种行为?如果是这样,那听起来像是平台问题。使用CE时要记住的一件事是,由于OEM对操作系统的实际实现有很多控制权,因此您永远不能排除行为的平台错误。
关于c# - MessageBox问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3738115/