這真的很煩人。我將該標籤用作列表項用戶控件的一部分,用戶可以在該列表中單擊該標籤以選擇列表項並雙擊該列表項對其進行重命名。但是,如果您在剪貼板中有一個名稱,則雙擊該標籤將用標籤的文本替換它!有什麼辦法可以禁用.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