Есть ли способ отключить функцию «двойного щелчка для копирования» метки .NET? - PullRequest
25 голосов
/ 26 марта 2010

Это действительно раздражает. Я использую метку как часть пользовательского элемента управления элемента списка, где пользователь может щелкнуть его, чтобы выбрать элемент списка, и дважды щелкнуть его, чтобы переименовать. Однако, если у вас есть имя в буфере обмена, двойной щелчок на ярлыке заменит его текстом ярлыка!

Я также проверил другие метки в приложении, и они также будут скопированы в буфер обмена двойным щелчком. Я не написал код буфера обмена в этой программе, и я использую стандартные метки .NET.

Есть ли способ отключить эту функцию?

Ответы [ 6 ]

7 голосов
/ 28 июля 2011

Я смог сделать это, используя комбинацию других данных ответов. Попробуйте создать этот производный класс и замените любые метки, которые вы хотите отключить с ним в функции буфера обмена:

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
3 голосов
/ 18 мая 2015

Если внутреннее текстовое значение пусто, то дважды щелкните метку, не пытаясь скопировать текстовое значение в буфер обмена. Этот метод более чище, чем другие альтернативы, я думаю:

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);
            }
        }
    }
}
3 голосов
/ 26 марта 2010

Я нашел этот пост . Похоже, последний плакат получил решение от Microsoft, хотя и не идеальное решение.

2 голосов
/ 07 мая 2013

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);
    }

}
1 голос
/ 29 декабря 2010

Мое решение (ужасно некрасивое, но, похоже, работает) состояло в том, чтобы скопировать текст буфера обмена в локальную переменную одним щелчком и восстановить его двойным щелчком, если буфер обмена отличается от локальной переменной. Очевидно, что предшественник двойного щелчка - это первый одиночный щелчок, поэтому он работает.

Я собираюсь пометить этот вопрос, потому что я бы предпочел более чистый метод!

0 голосов
/ 07 октября 2017

Я попробовал решения, опубликованные выше, и они не работали для меня. = (Следуя этой основной идее, хотя (благодаря вышеизложенному) я прибыл сюда, и это, кажется, работает (немного чище). (Работает на 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 и т. П., Хотя принцип будет таким же. Как уже упоминалось, вы можете перебирать буфер обмена для всех доступных форматов (или тех, которые вас интересуют), вставлять эти значения в объект Dictionary и затем восстанавливать их после слов. Текст и фотографии покрывают это для меня, в данном случае.

Одна полезная (и предупреждающая) ссылка для просмотра на эту тему находится здесь: Как сделать резервную копию и восстановить системный буфер обмена в C #?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...