通过单击激活表单时,防止表单中的焦点更改

时间:2018-03-13 07:18:39

标签: c# .net winforms

在C#WinForms应用程序中是否可以单击未聚焦表单上的任何位置(以聚焦表单),而无需在点击点处聚焦/选择任何控件?

我试图模仿Excel的工作方式,如果单击未聚焦的Excel工作簿/工作表,它将聚焦(并带到工作簿/工作表),但不会更改所选的单元格。

2 个答案:

答案 0 :(得分:3)

您可以覆盖WndProc并处理WM_MOUSEACTIVATE,然后检查当前表单是否为活动表单,将MA_ACTIVATEANDEAT设置为激活窗口的结果,并丢弃鼠标消息。< / p>

const int WM_MOUSEACTIVATE = 0x0021;
const int MA_ACTIVATEANDEAT = 2;
protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_MOUSEACTIVATE && Form.ActiveForm != this)
        m.Result = (IntPtr)MA_ACTIVATEANDEAT;
    else
        base.WndProc(ref m);
}

使用上面的代码,当您单击另一个表单或其中一个控件时,另一个表单激活,但单击的控件不会接收鼠标单击,而另一个表单上的活动控件不会更改。

答案 1 :(得分:0)

它使用2个处理程序,表单已停用且表单已激活:

private void Form_Activated(object sender, EventArgs e)
{
    dataGridView1.Enabled = true;
}

private void Form_Deactivate(object sender, EventArgs e)
{
    dataGridView1.Enabled = false;
}

如果你想要像这样通知控制,也可以使用DataGridView's焦点处理程序。