除非单击,如何防止文本框获得焦点?

时间:2018-09-06 17:26:57

标签: c# .net winforms

我有一个WinForms应用程序,该应用程序的顶部有一个TextBox控件(搜索框)。在正常的应用程序使用过程中,此TextBox一直受到关注,并且非常分散注意力。

我希望TextBox仅在用户明确单击它时才获得焦点。

我可以想到一些相当复杂的方法来完成此任务:

  • 单击时将文本框的图像更改为文本框
  • 跟踪鼠标单击并根据鼠标状态将焦点移开

有什么简单的方法可以做到这一点吗?


根据新的理解进行编辑以添加对问题的更好描述

基于我收到的答案,我现在对导致此问题的原因有了一些更好的理解。当用户与我的应用程序交互时,各种操作将导致控件被禁用或完全消失。如果这些控件中的一个恰好同时具有焦点,则按Tab键顺序的下一个控件将获得焦点。

在添加有问题的文本框之前,我不知道“下一个控件”是什么。该应用程序在任何给定时间都有数百个屏幕控件,而且我很确定不会故意定义选项卡顺序。无论以前是什么,它都是无害的。添加搜索文本框后,似乎该控件将始终以焦点结尾。

这是一个非常简单的示例,演示了正在发生的事情:

public class Form1 : Form
{
    public Form1()
    {
        var button = new Button
        {
            Location = new System.Drawing.Point(159, 67),
            Size = new System.Drawing.Size(75, 23),
            TabIndex = 0,
            Text = @"Click me"
        };
        button.Click += (sender, args) => button.Enabled = false;

        var textBox = new TextBox
        {
            Location = new System.Drawing.Point(159, 142),
            Name = "textBox1",
            Size = new System.Drawing.Size(174, 20),
            TabIndex = 1
        };

        SuspendLayout();
        ClientSize = new System.Drawing.Size(486, 392);
        Controls.Add(textBox);
        Controls.Add(_button);
        ResumeLayout(false);
        PerformLayout();
    }
}

启动应用程序后,单击按钮将强制文本框获得焦点,因为它是制表符顺序中的下一个。如手提包螃蟹在接受的答案中提到的那样,可以通过在文本框中设置TabStop = false来避免这种行为。

2 个答案:

答案 0 :(得分:2)

textBox1.TabStop = false;

以上内容应使它停止从制表符位置接收焦点。

答案 1 :(得分:0)

子类化TextBox并通过WndProc函数来捕获焦点消息并进行处理。也许是这样的:

if (m.Msg == WM_MOUSEACTIVATE) {
    m.Result = (IntPtr)MA_NOACTIVATEANDEAT;
    return;
  }
  base.WndProc(ref m);