Winforms 是否可以通过双击禁用textbox选择部分文本

Winforms 是否可以通过双击禁用textbox选择部分文本,winforms,events,textbox,Winforms,Events,Textbox,双击文本框的默认行为是选择文本的一部分。我想选择一个词来覆盖它。但我发现处理双击事件(或重写OnDoubleClick方法)实际上是先执行默认行为,然后执行代码。是否可以禁用默认行为。使用标准的WinForms事件处理程序似乎无法做到这一点(双击和鼠标双击无法抑制默认行为),但是您可以通过创建自定义的WndProc并自己处理窗口消息来实现这一点 在下面的示例中,我覆盖了我创建的类中的默认值。我通过这个类公开了PreviewDoubleClick事件,如果在客户端代码中处理,可以通过设置e.han

双击文本框的默认行为是选择文本的一部分。我想选择一个词来覆盖它。但我发现处理双击事件(或重写OnDoubleClick方法)实际上是先执行默认行为,然后执行代码。是否可以禁用默认行为。

使用标准的WinForms事件处理程序似乎无法做到这一点(
双击
鼠标双击
无法抑制默认行为),但是您可以通过创建自定义的
WndProc
并自己处理窗口消息来实现这一点

在下面的示例中,我覆盖了我创建的类中的默认值。我通过这个类公开了
PreviewDoubleClick
事件,如果在客户端代码中处理,可以通过设置
e.handled=true来抑制默认的双击行为。在本例中,事件在
OnPreviewDoubleClick
事件处理程序中处理,您可以在其中添加自定义代码,以便根据需要对双击做出反应

如果您需要有关双击的其他鼠标信息,我相信您可以通过
WndProc
中的/字段获得

(下面的代码假设您已经为表单设置了一些代码)

使用系统;
使用System.Windows.Forms;
命名空间Windows窗体应用程序2
{
类DoubleClickEventArgs:EventArgs
{
公共图书馆
{
得到;
设置
}
}
类PreviewTextBox:TextBox
{
公共事件事件处理程序预览双击;
受保护的覆盖无效WndProc(参考消息m)
{
if((m.Msg==WM_DBLCLICK)| |(m.Msg==WM_lbuttondblck))
{
var e=新的DoubleClickEventArgs();
如果(PreviewDoubleClick!=null)
预览双击(此,e);
如果(如已处理)
返回;
}
基准WndProc(参考m);
}
常量int WM_DBLCLICK=0xA3;
常数int WM_lbuttondblck=0x203;
}
公共部分类TestForm:Form
{
公共测试表单()
{
初始化组件();
_textBox=新预览文本框();
_textBox.Text=“测试文本foo-bar”;
_textBox.PreviewDoubleClick+=新事件处理程序(OnPreviewDoubleClick);
控件。添加(_文本框);
}
预览时无效双击(对象发送者,双击事件参数)
{
e、 已处理=正确;
}
预览文本框_文本框;
}
}
using System;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    class DoubleClickEventArgs : EventArgs
    {
        public bool Handled
        {
            get;
            set;
        }
    }

    class PreviewTextBox : TextBox
    {
        public event EventHandler<DoubleClickEventArgs> PreviewDoubleClick;

        protected override void WndProc(ref Message m)
        {
            if ((m.Msg == WM_DBLCLICK) || (m.Msg == WM_LBUTTONDBLCLK))
            {
                var e = new DoubleClickEventArgs();

                if (PreviewDoubleClick != null)
                    PreviewDoubleClick(this, e);

                if (e.Handled)
                    return;
            }

            base.WndProc(ref m);
        }

        const int WM_DBLCLICK = 0xA3;
        const int WM_LBUTTONDBLCLK = 0x203;
    }

    public partial class TestForm : Form
    {
        public TestForm()
        {
            InitializeComponent();

            _textBox = new PreviewTextBox();
            _textBox.Text = "Test text foo bar";
            _textBox.PreviewDoubleClick += new EventHandler<DoubleClickEventArgs>(OnPreviewDoubleClick);

            Controls.Add(_textBox);
        }

        void OnPreviewDoubleClick(object sender, DoubleClickEventArgs e)
        {
            e.Handled = true;
        }

        PreviewTextBox _textBox;
    }
}