【问题标题】:MessageBox without focus on a MessageBoxButton不关注 MessageBoxButton 的 MessageBox
【发布时间】:2015-02-20 08:08:57
【问题描述】:

有没有办法在 C# 中显示 MessageBox 而无需关注消息框中的按钮?例如下面的代码 sn-p (不能按预期工作):

 MessageBox.Show("I should not have a button on focus",
                        "Test",
                        MessageBoxButtons.YesNo,
                        MessageBoxIcon.Question,
                        MessageBoxDefaultButton.Button3);

我想要的是显示 MessageBox 时没有关注 [Yes] 或 [No]。背景是客户扫描了几个在and 处有回车的条码。因此,当消息框弹出时,他们会在没有注意到消息框的情况下扫描更多条码,然后“按下”按钮。

【问题讨论】:

  • 恐怕这对于普通的 MessageBox 来说是不可能的,因为它只是由一堆按钮和一个静态按钮组成,后者无法获得焦点。因此,至少一个按钮始终具有焦点。您可以将取消添加到组合中,将其设为默认值,然后在按下取消时重新显示消息框。
  • 我认为最简单的方法是通过您自己的表单实现 MessageBox....
  • 当然可以。如果你拥有这台电脑,你就拥有这台电脑。但是MessageBox 没有提供一种方便 的方式来保证没有默认值。按 Return 将始终关闭带有某个值的对话框。请注意,当然,您可以将第三个按钮设为默认按钮(即 YesNoCancel 框的 Cancel 按钮)并要求用户按下 Cancel 以外的其他按钮以继续;您只需重新显示该框,直到它们显示为止。
  • 我很确定这是不可能的。您可以实现自定义 MessageBox,也可以将焦点推送到不会执行任何操作的按钮(这是一个肮脏的技巧)。

标签: c# .net


【解决方案1】:

你当然可以通过一些技巧来做到这一点。

[DllImport("user32.dll")]
static extern IntPtr SetFocus(IntPtr hWnd);

private void button1_Click(object sender, EventArgs e)
{
    //Post a message to the message queue.
    // On arrival remove the focus of any focused window. 
    //In our case it will be default button.
    this.BeginInvoke(new MethodInvoker(() =>
    {
        SetFocus(IntPtr.Zero);//Remove the focus
    }));

    MessageBox.Show("I should not have a button on focus",
               "Test",
               MessageBoxButtons.YesNo,
               MessageBoxIcon.Question,
               MessageBoxDefaultButton.Button3);
}

请注意,上面的代码假定当BeginInvoke 被调用时,MessageBox 被显示并且它获得了按钮的焦点。据我所知,情况通常如此。如果您想确保消息框已经显示,您可以使用this code 找到它,然后您可以移除焦点。

【讨论】:

  • 这行得通,但它有一个烦人的副作用,也就是说,你可以使用键盘(例如,Tab),除非你激活另一个窗口然后“重新激活”消息框。单击消息框的标题(或按钮以外的任何其他位置)不会使其“激活”。
【解决方案2】:

这在标准 MessageBox 中是不可能的——如果你想要这个功能,你需要自己实现。

请参阅 here 以帮助您入门。

【讨论】:

【解决方案3】:
  • 在您的项目中添加一个新表单,命名为msg
  • 在此表单中添加标签,在此标签的文本中写下您的信息
  • 添加一个button1,其文本属性设置为OK
  • 添加textBox1 并将Visible 属性设置为false
  • 将此代码添加到msg_FormLoad():

    txtBox1.Focus();

  • 将此代码添加到buton1_Click:

    this.Close();

  • 无论何时你想展示你的信息,你都可以:

    msg msgBox = new msg(); msgBox.ShowDialog();

  • 完成!

P.S:由于暂时没有 IDE,所以没有测试,但我想它可以调整为不费吹灰之力

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2012-08-27
    • 2017-03-27
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多