【发布时间】:2011-12-12 17:50:04
【问题描述】:
我想在特定文本框中覆盖粘贴功能。将文本粘贴到该文本框中时,我希望它执行以下操作:
AddressTextBox.Text = Clipboard.GetText().Replace(Environment.NewLine, " ");
(从多行更改为单行)
我该怎么做?
【问题讨论】:
标签: c# winforms visual-studio-2010 textbox
我想在特定文本框中覆盖粘贴功能。将文本粘贴到该文本框中时,我希望它执行以下操作:
AddressTextBox.Text = Clipboard.GetText().Replace(Environment.NewLine, " ");
(从多行更改为单行)
我该怎么做?
【问题讨论】:
标签: c# winforms visual-studio-2010 textbox
这是可能的,您可以截获原生 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);
}
}
【讨论】:
要拦截文本框控件中的消息,请从 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
【讨论】:
MyTb。当您构建项目时,MyTB 将出现在工具箱中。你可以把它放在你的表单上。