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