MessageBox存在问题

3

我遇到了一个有关MessageBox模态窗口的问题。

具体情况如下:

  • 用户从表单中选择xx
  • MessageBox出现
  • 用户打开嵌入式软键盘(设备内置的)
  • 用户关闭键盘
  • MessageBox失去焦点(怎么会这样?它应该是模态的!),主窗体显示在前景中
  • 应用程序被阻塞,因为用户现在无法关闭MessageBox。

下面是MessageBox的代码片段。

MessageBox.Show("message", "caption", MessageBoxButtons.OK, MessageBoxIcon.Asterisk,
                                    MessageBoxDefaultButton.Button1);

有没有解决这个问题的想法?

还有其他有趣的因素吗?看起来你已经应该可以“顺利运行”了。如果你创建一个新的窗体并在该窗体上执行ShowModal(),你会看到相同的行为吗? - Nate
3个回答

1

这在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);

你会得到完全相同的行为。

唯一不符合预期的是,父窗体出现在消息框之上。我刚在我的桌面上测试了一个基于ARM的CE 5.0设备,无论是CF还是P/Invoke版本,消息框都保持在顶部。

如果您能够使用非常基本的应用程序(即只有一个表单、一个按钮)重现此行为吗?如果可以,那么这听起来像是一个平台问题。关于使用CE的一件事情是,由于OEM对OS实际实现方式有很大的控制权,因此您永远不能排除平台错误的可能性。


0

在调用MessageBox.Show时,您需要包含对父窗体的引用(即IWin32Window参数,通常只需传入“this”)。我相信这是您想要使用的重载-请参见下面:

MessageBox.Show Method (IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton)

这里是微软文档的链接。

祝您愉快!


2
不可以 - CF 不支持这个,即使支持也不能解决这个问题(请参见我的答案) - ctacke

0
MessageBox.Show("Please insert Correct Username and Password.", "Login Error",
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
this.Focus();

这是一个简单的解决方案,无需运行任何JavaScript或其他C#代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接