C# MessageBox不关注MessageBox按钮

C# MessageBox不关注MessageBox按钮,c#,.net,C#,.net,有没有一种方法可以在不聚焦于消息框中的按钮的情况下用C#显示消息框?例如,以下代码段(未按预期工作): 我想要的是,MessageBox显示时不聚焦于[是]或[否]。背景是,客户扫描了在和处有回车的几个条形码。因此,当messagebox弹出时,他们会在没有注意到messagebox的情况下扫描更多的条形码,他们会“按”一个按钮。这在标准messagebox中是不可能的-如果您想要此功能,您需要实现自己的功能 看看如何让你开始。好吧,你当然可以通过一些技巧来做到这一点 [DllImport("u

有没有一种方法可以在不聚焦于消息框中的按钮的情况下用C#显示消息框?例如,以下代码段(未按预期工作):


我想要的是,MessageBox显示时不聚焦于[是]或[否]。背景是,客户扫描了在和处有回车的几个条形码。因此,当messagebox弹出时,他们会在没有注意到messagebox的情况下扫描更多的条形码,他们会“按”一个按钮。

这在标准messagebox中是不可能的-如果您想要此功能,您需要实现自己的功能


看看如何让你开始。

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

[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
,并使按钮聚焦。据我所知,情况通常是这样。如果您想确保消息框已经显示,您可以使用它查找,然后可以删除焦点。

  • 将新表单添加到项目名称it
    msg
  • 在此表单中添加标签,然后在此标签文本中写入您的邮件
  • 添加一个
    按钮1
    ,其文本属性设置为
    OK
  • 添加一个
    textBox1
    ,属性设置为
    false
  • 将此代码添加到
    msg\u FormLoad()

    txtBox1.Focus()

  • 将此代码添加到
    但是单击

    这个。关闭()

  • 无论何时,只要您想显示您的信息,您就可以:

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

  • 完成了

附言:由于目前缺少IDE,所以没有进行测试,但我想它可以调整到不费吹灰之力就能工作的状态

我担心,对于一个普通的MessageBox来说,这是不可能的,因为它只是由一串按钮和一个静态按钮组成,后者没有焦点。因此,至少有一个按钮始终具有焦点。你可以将Cancel添加到混音中,使其成为默认值,如果按下Cancel,只需重新显示消息框。我认为最简单的方法是用你自己的表单实现MessageBox……这当然可以做到。如果你拥有这台电脑,你就拥有这台电脑。但是,
MessageBox
并没有提供一种方便的方式来实现无默认设置。按Return键将始终关闭带有某个值的对话框。当然,请注意,您可以将第三个按钮设为默认按钮(即
YesNoCancel
框的
Cancel
按钮),并要求用户按除
Cancel
以外的其他按钮继续操作;你只需要重新显示盒子,直到他们显示为止。我很确定这是不可能的。你可以实现一个定制的MessageBox,也可以将焦点按到一个不会执行任何操作的按钮上(这是一个肮脏的把戏)。我相信这是正确的。NET的
MessageBox.Show
只是Win32 MessageBox函数的包装器,它没有任何这样的选项:这可以工作,但它有一个恼人的副作用,即,除非您激活另一个窗口,然后“重新激活”消息框,否则您完全可以使用键盘(例如,
Tab
)。单击消息框的标题(或按钮以外的任何其他位置)不会使其“激活”。
[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);
}