我有一个想要模态化的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/

10-14 11:21