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

C# 如何防止文本框获得焦点,除非单击?,c#,.net,winforms,C#,.net,Winforms,我有一个WinForms应用程序,它的顶部有一个文本框控件(搜索框)。此文本框在正常应用程序使用期间不断接收焦点,非常分散注意力 我希望文本框仅在用户明确单击时接收焦点。 我可以想出几个相当复杂的方法来实现这一点: 单击时将文本框的图像更改为文本框 跟踪鼠标单击并根据鼠标状态转移焦点 我能做些更简单的事情来完成这个任务吗 编辑以根据新的理解添加问题的更好描述 根据我收到的答案,我现在对造成这个问题的原因有了更好的理解。当用户与我的应用程序交互时,各种操作会导致控件被禁用或完全消失。如果这些

我有一个WinForms应用程序,它的顶部有一个文本框控件(搜索框)。此文本框在正常应用程序使用期间不断接收焦点,非常分散注意力

我希望文本框仅在用户明确单击时接收焦点。

我可以想出几个相当复杂的方法来实现这一点:

  • 单击时将文本框的图像更改为文本框
  • 跟踪鼠标单击并根据鼠标状态转移焦点
我能做些更简单的事情来完成这个任务吗


编辑以根据新的理解添加问题的更好描述 根据我收到的答案,我现在对造成这个问题的原因有了更好的理解。当用户与我的应用程序交互时,各种操作会导致控件被禁用或完全消失。如果这些控件中的一个碰巧在当时具有焦点,则选项卡顺序中的下一个控件将接收焦点

在添加相关文本框之前,我不知道“下一个控件”是什么。该应用程序在任何给定的时间屏幕上都有数百个控件,我很确定tab order从来都不是故意定义的。不管以前是什么,它都是无害的。添加搜索文本框后,该控件似乎总是以焦点结束

下面是一个非常简单的示例,演示了发生的情况:

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
来避免这种行为

textBox1.TabStop = false;
上面所述应该可以阻止它从tabing接收焦点


上述操作应能阻止它从制表符接收焦点。

对文本框和WndProc函数进行子类化,以捕获焦点消息并对其进行处理。也许是这样的:

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

对TextBox和over WndProc函数进行子类化,以捕获焦点消息并对其进行处理。也许是这样的:

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

为什么文本框将焦点放在第一位?这是因为人们在切换还是有代码不断设置焦点?在正常情况下,它不应该获得焦点。也许你应该展示你的代码,你正在做的一些事情会引起关注。我无法解释。应用程序中没有很多控件可以接收焦点,但是有几个搜索框,具体取决于当时活动的视图。我刚刚添加了一个新的搜索框,在用户进行任何操作后,它似乎都会自动获得焦点。其他搜索框历史上从未出现过这个问题,我无法解释其中的区别。你不需要解释,代码会帮你做到这一点。如果没有代码,你真正能得到的最好的东西就是猜测。这是不正常的(正如您在其他控件中提到的),因此我们需要找到导致它的原因。也许您可以比较其他文本框在.designer.cs文件中的设置方式,也许某些属性设置不同。为什么文本框首先得到关注?这是因为人们在切换还是有代码不断设置焦点?在正常情况下,它不应该获得焦点。也许你应该展示你的代码,你正在做的一些事情会引起关注。我无法解释。应用程序中没有很多控件可以接收焦点,但是有几个搜索框,具体取决于当时活动的视图。我刚刚添加了一个新的搜索框,在用户进行任何操作后,它似乎都会自动获得焦点。其他搜索框历史上从未出现过这个问题,我无法解释其中的区别。你不需要解释,代码会帮你做到这一点。如果没有代码,你真正能得到的最好的东西就是猜测。这是不正常的(正如您在其他控件中提到的),因此我们需要找到导致它的原因。也许您可以比较其他文本框在.designer.cs文件中的设置方式,也许某些属性设置不同的工具。很高兴能帮上忙。很高兴能帮上忙,谢谢。虽然这不是解决方案,但它确实帮助我调试了这个问题。我使用您的建议查找WM_SETFOCUS消息,并在那里设置了一个断点。这让我能够更好地理解问题的起因。谢谢。虽然这不是解决方案,但它确实帮助我调试了这个问题。我使用您的建议查找WM_SETFOCUS消息,并在那里设置了一个断点。这使我能够更好地理解问题的起因。