2013-06-11 13 views
7

Quando faccio una ricerca attraverso il mio intero progetto in Visual Studio per la parola 'appunti' non trovo corrispondenze.Il doppio clic sul controllo .NET Label copia il testo negli appunti su Vista +?

Eppure in qualche modo il mio programma sembra cambiare il contenuto dei miei appunti per essere uguale alla proprietà .text di un controllo sul mio modulo. Come può essere?

Ho identificato il gestore dopo il quale il mio blocco appunti sembra sempre essere cambiato e ha aggiunto una messagebox per ottenere il testo dagli appunti per cercare di identificare quando potrebbe essere cambiato.

MessageBox.Show(Clipboard.GetText) 

Anche al vertice della gestione dell'evento mia appunti è già stato modificato alla proprietà .text di un controllo sub. Questo è l'unico sotto che gestisce questo evento e gli appunti cambiano sempre dopo questo evento.

Questo è un piccolo progetto di winforms scritto in vb.net.

Maggiori informazioni:

mio clipboard è sempre impostata sulla proprietà .text di un'etichetta quando clicco su di esso. Le etichette sono fatte qui:

For i = 0 To lstTupChildren.Count - 1 
    Dim lbl As New Label() 
    lbl.Size = New System.Drawing.Size(250, 25) 
    lbl.Font = New System.Drawing.Font("Calibri (body)", 10) 
    lbl.Text = i + 1 & ". " & lstTupChildren(i).Item1 
    lbl.Location = New System.Drawing.Point(0, 25 * i) 
    If lstTupChildren(i).Item3 = True Then lbl.BackColor = Color.GreenYellow Else lbl.BackColor = Color.Orange 'sets the colour depending on whether the timesheet is active' 
     Me.Controls.Add(lbl) 
     AddHandler lbl.DoubleClick, AddressOf subChangeTimesheetState 'adds handler for double click to change status 
     'adds handlers for moving the overlay 
     AddHandler lbl.MouseDown, AddressOf Form_MouseDown 
     AddHandler lbl.MouseMove, AddressOf Form_MouseMove 
     'adds handler for hide context menu' 
     AddHandler lbl.MouseClick, AddressOf subRightClickMenu 

    Next 

anche quando io commento del gestore: AddHandler lbl.DoubleClick, AddressOf subChangeTimesheetState

mia appunti è ancora cambiato.

Aggirare è disponibile qui: lavoro intorno qui: http://www.aspnet-answers.com/microsoft/NET-WinForms-Controls/32231136/double-click-label-and-its-text-appears-on-the-clipboard.aspx

creare una nuova classe che eredita l'etichetta, il codice vb:

Public Class myLabel

Inherits Label 
Private WM_GETTEXT As Integer = &HD 
Private WM_LBUTTONDBLCLK As Integer = &H203 
Private doubleclickflag As Boolean = False 
Protected Overrides Sub WndProc(ByRef m As Message) 
    If m.Msg = WM_LBUTTONDBLCLK Then 
     doubleclickflag = True 
    End If 
    If m.Msg = WM_GETTEXT AndAlso doubleclickflag Then 
     doubleclickflag = False 
     Return 
    End If 
    MyBase.WndProc(m) 
End Sub 

End Class

+0

Quindi, se si rimuove il gestore, lo fa non cambia? –

+1

Che tipo di controllo è? Solo una casella di testo o qualcos'altro? –

+0

questa è un'ottima domanda @ZachJohnson – 5uperdan

risposta

12

Non è il tuo codice, è una "funzionalità" introdotta in Windows Vista.

In Windows Vista, un programmatore di shell di Windows ha eseguito il controllo di una modifica (senza specifica/giustificazione nell'elenco delle modifiche) che ha modificato il controllo etichetta predefinito per copiarne il testo negli Appunti quando si fa doppio clic.

Questa modifica in genere non influisce sulle applicazioni C++ a causa del modo in cui creano/ospitano il controllo dell'etichetta, ma influisce su tutte le applicazioni VS.NET. Ho presentato un bug contro il (sorpreso) team di Framework quando l'ho scoperto nel time frame di Win7, ma avevano paura di correggere il bug perché era presente da così tanto tempo.

Ecco il duplicato Is there any way to disable the "double-click to copy" functionality of a .NET label?

+1

OMG È VERO! SONO COSÌ SCOSSA NON POSSO SPEGNERE CAPSLOCK. – 5uperdan

+0

+1. Una grande caratteristica! Non sapevo che potessi farlo. Tuttavia, non funziona sulla classe messagebox, probabilmente perché è COM sotto il cofano. – Neolisk

+0

FWIW: Non penso che MessageBox usi affatto COM; puoi chiamarlo in un'applicazione che non chiama mai CoInitialize. – EricLaw

4

Il modo migliore per ottenere l'etichetta di non reagire in un doppio clic è quello di ignorare lo stile di classe sovrascrivendo la classe etichetta stessa.

private class SingleClickLabel : Label 
    { 
     protected override CreateParams CreateParams 
     { 
      get 
      { 
       new SecurityPermission(SecurityPermissionFlag.UnmanagedCode).Demand(); 

       CreateParams cp = base.CreateParams; 
       cp.ClassStyle &= ~0x0008; 
       cp.ClassName = null; 

       return cp; 
      } 
     } 
    } 

Rimuove lo stile di classe della finestra CS_DBLCLKS dall'etichetta. L'unico evento che verrà attivato da ora è l'evento Click per ogni clic che si verifica.

Vedi: http://msdn.microsoft.com/en-us/library/windows/desktop/ff729176(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/system.windows.forms.createparams(v=vs.110).aspx

+0

E se il problema è che un doppio clic sull'etichetta è _ richiesto nel programma in determinate circostanze, ma non voglio che questo cancelli gli appunti, però? Pensa alla tavolozza dei colori nel programma di modifica delle immagini aprendo il selettore di colori con un doppio clic. – Nyerguds

1

Suppongo che ci sono un certo numero di modi diversi per risolvere questo stesso problema. Ecco cosa mi è venuta (utilizzando un'etichetta ereditata, testato su 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); 
     } 
    } 
} 

qualche sforzo in più avrebbe dovuto essere investito per conservare le cose come i campi di Excel copiati e simili, anche se il principio sarebbe lo stesso Come accennato, è possibile eseguire iterazioni negli Appunti per tutti i formati disponibili (o quelli che ti interessano) e inserire questi valori in un oggetto Dizionario, quindi ripristinarli. Il testo e le foto lo coprono per me, in questo caso.

Un collegamento pena di vedere su questo argomento è qui: How do I backup and restore the system clipboard in C#?

Problemi correlati