Public Class LabelWithOptionalCopyTextOnDoubleClick
Inherits Label
Private Const WM_LBUTTONDCLICK As Integer = &H203
Private clipboardText As String
<DefaultValue(False)> _
<Description("Overrides default behavior of Label to copy label text to clipboard on double click")> _
Public Property CopyTextOnDoubleClick As Boolean
Protected Overrides Sub OnDoubleClick(e As System.EventArgs)
If Not String.IsNullOrEmpty(clipboardText) Then Clipboard.SetData(DataFormats.Text, clipboardText)
clipboardText = Nothing
MyBase.OnDoubleClick(e)
End Sub
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If Not CopyTextOnDoubleClick Then
If m.Msg = WM_LBUTTONDCLICK Then
Dim d As IDataObject = Clipboard.GetDataObject()
If d.GetDataPresent(DataFormats.Text) Then
clipboardText = d.GetData(DataFormats.Text)
End If
End If
End If
MyBase.WndProc(m)
End Sub
End Class
using System;
using System.Windows.Forms;
public class LabelNoCopy : Label
{
private string text;
public override string Text
{
get
{
return text;
}
set
{
if (value == null)
{
value = "";
}
if (text != value)
{
text = value;
Refresh();
OnTextChanged(EventArgs.Empty);
}
}
}
}
using System.ComponentModel;
using System.Windows.Forms;
using System;
public class LabelWithOptionalCopyTextOnDoubleClick : Label
{
private const int WM_LBUTTONDCLICK = 0x203;
private string clipboardText;
[DefaultValue(false)]
[Description("Overrides default behavior of Label to copy label text to clipboard on double click")]
public bool CopyTextOnDoubleClick { get; set; }
protected override void OnDoubleClick(EventArgs e)
{
if (!string.IsNullOrEmpty(clipboardText))
Clipboard.SetData(DataFormats.Text, clipboardText);
clipboardText = null;
base.OnDoubleClick(e);
}
protected override void WndProc(ref Message m)
{
if (!CopyTextOnDoubleClick)
{
if (m.Msg == WM_LBUTTONDCLICK)
{
IDataObject d = Clipboard.GetDataObject();
if (d.GetDataPresent(DataFormats.Text))
clipboardText = (string)d.GetData(DataFormats.Text);
}
}
base.WndProc(ref m);
}
}
6条答案
按热度按时间cqoc49vn1#
我能够用给出的其他答案的组合来做到这一点。尝试创建此派生类,并将任何您希望禁用剪贴板功能的标签替换为它:
8zzbczxx2#
当内部文本值为空时,双击标签,不尝试将文本值复制到剪贴板。这个方法比我认为的其他选择更干净:
6jygbczu3#
找到this post了最后一张海报似乎得到了微软的解决方案,尽管不是一个完美的解决方案。
vfh0ocws4#
TKTS解决方案转换为C#
对于初学者:(添加新类、构建、转到设计器并从名为“LabelWithOptialCopyTextOnDoubleClick”的工具箱拖放位置)
thtygnil5#
我的解决方案(非常丑陋,但似乎有效)是在单击时将剪贴板文本复制到局部变量,如果剪贴板与局部变量不同,则在双击时将其还原。显然,双击的前兆是第一次单击,这就是为什么它能起作用。
我将在这个问题上加星,因为我喜欢一个更干净的方法!
mcdcgff06#
我尝试了上面发布的解决方案,它们不适合我。=(遵循这个基本的想法,虽然(感谢上面),我来到了这里,这似乎工作(有点干净了)。(在Windows Server 2012 R2上运行)
必须投入一些额外的精力来保存复制的Excel字段等,尽管原理是一样的。如前所述,您可以在剪贴板上迭代所有可用的格式(或您关心的格式),并将这些值填充到Dictionary对象中,然后在后面恢复它们。文字和图片涵盖了它,在这种情况下。
关于这个问题,有一个值得(和警示)的链接在这里:如何在C#中备份和还原系统剪贴板?