这真的很烦人。我将该标签用作列表项用户控件的一部分,用户可以在该列表中单击该标签以选择列表项并双击该列表项对其进行重命名。但是,如果您在剪贴板中有一个名称,则双击该标签将用标签的文本替换它!有什么办法可以禁用.NET标签的“双击复制”功能吗?
我也检查了应用程序中的其他标签,他们也将双击复制到剪贴板。我没有在这个程序中编写任何剪贴板代码,而且我正在使用标准的.NET标签。
有什么办法可以禁用这个功能吗?
这真的很烦人。我将该标签用作列表项用户控件的一部分,用户可以在该列表中单击该标签以选择列表项并双击该列表项对其进行重命名。但是,如果您在剪贴板中有一个名称,则双击该标签将用标签的文本替换它!有什么办法可以禁用.NET标签的“双击复制”功能吗?
我也检查了应用程序中的其他标签,他们也将双击复制到剪贴板。我没有在这个程序中编写任何剪贴板代码,而且我正在使用标准的.NET标签。
有什么办法可以禁用这个功能吗?
我的解决方案(非常丑陋,但它似乎工作)是在单击时将剪贴板文本复制到本地变量,如果剪贴板不同于本地变量,则双击时恢复它。显然,双击的先兆是第一次单击,这就是它的原因。
我打算明白这个问题,因为我喜欢更清洁的方法!
这是一个“解决方法”字面上...好,但 你还需要检查数据类型,因为它不总是'剪贴板中的'字符串...也是如果剪贴板甚至有一些数据在第一位。 – Sree 2017-06-30 09:26:56
我能够使用其他答案的组合来做到这一点。尝试创建此派生类和替换你想用它来禁用剪贴板功能的任何标签:
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
这对我来说,谢谢你觉得这个答案现在应该被标记为正确的答案,因为它保留了已经在剪贴板上的内容 – Cuthbert 2013-05-21 18:11:25
当然,这只能保留文本如果剪贴板包含这些格式的任何内容,棘手的问题在托管代码,你运气不好,我认为保存和恢复所有内容的最好方法是配对非托管功能。 – Medinoc 2013-12-05 16:38:09
好得多只需查看'Clipboard.GetDataObject().GetFormats()'并创建一个包含_everything_的'Dictionary
TKTS解决方案转换为C#
对于初学者: (添加新的类,建立,去设计和从名为“LabelWithOptionalCopyTextOnDoubleClick”工具箱拖放位置)
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);
}
}
当内部文本值是标签不试图复制文本值到剪贴板空然后双击。此方法比我认为的其他替代方案更清洁:
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);
}
}
}
}
事实上,我测试了这一点,它似乎只使用Label的私人文本变量作为剪贴板的东西,而不是公共属性。非常奇特,但看起来Paint函数确实使用了公共属性,所以这个覆盖工作正常,这使得这是一个非常快速和干净的修复。 – Nyerguds 2016-12-21 11:54:43
我尝试了上面发布的解决方案,但它们并不适用于我。 =(以下这个基本思路,虽然(感谢以上),我来到这里,这似乎工作(干净了一点太)。(在Windows Server 2012 R2)
public class MyLabel : System.Windows.Forms.Label
{
private const int WM_LBUTTONDBLCLK = 0x203;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_LBUTTONDBLCLK)
{
string sSaved = Clipboard.GetText();
System.Drawing.Image iSaved = Clipboard.GetImage();
base.WndProc(ref m);
if (iSaved != null) Clipboard.SetImage(iSaved);
if (!string.IsNullOrEmpty(sSaved)) Clipboard.SetText(sSaved);
}
else
{
base.WndProc(ref m);
}
}
}
上运行一些额外的努力将有被投资来保存像复制的Excel字段之类的东西,尽管原理是一样的。如前所述,您可以遍历剪贴板中所有可用的格式(或您关心的),并将这些值填入字典对象,然后将它们恢复后缀。在这种情况下,文本和图片会覆盖它我的文字和图片
一个值得(并警示)链接看到这个问题在这里: How do I backup and restore the system clipboard in C#?
只是一个猜测 - 你有没有尝试过处理MouseDoubleClick事件,什么都不做? – 2010-03-25 21:45:28
我可以在我的Vista机器上重现此操作,但不能在两台XP机器上重现此操作。 – eschneider 2010-03-25 22:08:46
奥斯汀 - 不幸的是,这不起作用。在事件被触发之前,文本被复制到剪贴板。 – 2010-12-28 21:26:42