【问题标题】:Override Paste Into TextBox覆盖粘贴到文本框
【发布时间】:2011-12-12 17:50:04
【问题描述】:

我想在特定文本框中覆盖粘贴功能。将文本粘贴到该文本框中时,我希望它执行以下操作:

AddressTextBox.Text = Clipboard.GetText().Replace(Environment.NewLine, " ");

(从多行更改为单行)

我该怎么做?

【问题讨论】:

标签: c# winforms visual-studio-2010 textbox


【解决方案1】:

这是可能的,您可以截获原生 TextBox 控件获取的低级 Windows 消息,该消息告诉它从剪贴板粘贴。 WM_PASTE 消息。当您使用键盘按 Ctrl+V 或使用上下文菜单的粘贴命令时生成。您可以通过覆盖控件的 WndProc() 方法来捕获它,根据需要执行粘贴,将其传递给基类。

向您的项目添加一个新类并复制/粘贴如下所示的代码。编译。将工具箱顶部的新控件拖放到表单上,替换现有控件。

using System;
using System.Windows.Forms;

class MyTextBox : TextBox {
    protected override void WndProc(ref Message m) {
        // Trap WM_PASTE:
        if (m.Msg == 0x302 && Clipboard.ContainsText()) {
            this.SelectedText = Clipboard.GetText().Replace('\n', ' ');
            return;
        }
        base.WndProc(ref m);
    }
}

【讨论】:

  • 我是把它放在 Program.cs 还是 Form1.cs 中?我需要如何称呼它吗?因为它不工作
  • 你把它放在一个单独的类中。编译。将新控件从工具箱顶部拖放到表单上。
【解决方案2】:

要拦截文本框控件中的消息,请从 TexBox 派生一个类并 实施

class MyTB : System.Windows.Forms.TextBox
{

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {

            case 0x302: //WM_PASTE
                {
                    AddressTextBox.Text = Clipboard.GetText().Replace(Environment.NewLine, " ");
                    break;
                }

        }

        base.WndProc(ref m);
    }

}

建议here

【讨论】:

  • 如果我把它放在我的 Form1.cs 中,我会收到以下错误:错误无法通过嵌套类型访问外部类型的非静态成员,如果我放入 Program.cs 它说 AddressTextBox 确实在当前上下文中不存在。
  • 通过项目添加新类->添加新项-类命名为MyTb。当您构建项目时,MyTB 将出现在工具箱中。你可以把它放在你的表单上。
  • 感谢您的详细解释,但是您的代码没有起到作用,或者我没有正确使用它。无论如何,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
相关资源
最近更新 更多