Come copiare i dati negli Appunti in C #


Risposte:


799

Esistono due classi che vivono in assemblee diverse e spazi dei nomi diversi.

  • WinForms: utilizzare la seguente dichiarazione dello spazio dei nomi, assicurarsi che Mainsia contrassegnato con l' [STAThread]attributo:

    using System.Windows.Forms;
  • WPF: utilizzare la seguente dichiarazione dello spazio dei nomi

    using System.Windows;
  • console: aggiungere riferimento a System.Windows.Forms, utilizzare la seguente dichiarazione dello spazio dei nomi, assicurarsi che Mainsia contrassegnato con l' [STAThread]attributo. Guida dettagliata in un'altra risposta

    using System.Windows.Forms;

Per copiare una stringa esatta (letterale in questo caso):

Clipboard.SetText("Hello, clipboard");

Per copiare il contenuto di una casella di testo, utilizzare TextBox.Copy () o ottenere prima il testo, quindi impostare il valore degli Appunti:

Clipboard.SetText(txtClipboard.Text);

Vedi qui per un esempio . Oppure ... Documentazione ufficiale MSDN o qui per WPF .


Osservazioni:

  • Appunti è il concetto dell'interfaccia utente desktop, il tentativo di impostarlo nel codice lato server come ASP.Net imposterà solo il valore sul server e non ha alcun impatto su ciò che l'utente può vedere nel proprio browser. Mentre la risposta collegata consente di eseguire il lato server del codice di accesso agli Appunti SetApartmentState, è improbabile che tu voglia ottenere.

  • Se dopo le seguenti informazioni in questo codice di domanda viene comunque visualizzata un'eccezione, vedere "Errore del thread corrente sull'appartamento a thread singolo (STA)" nella stringa di copia negli Appunti

  • Questa domanda / risposta copre .NET normale, per .NET Core vedi - .Net Core - copia negli appunti?


@KierenJohnstone È possibile accedere al contenuto degli Appunti utilizzando coppie chiave-valore?
Abdul,

@Abdul - Non sono sicuro di cosa intendi. Il contenuto degli appunti può essere testo, file, immagini, qualsiasi tipo di dati personalizzati. Il concetto di coppie kv non sembra avere nulla a che fare con l'idea degli appunti?
Kieren Johnstone,

@KierenJohnstone quello che sto cercando di fare è qualcosa che un utente può memorizzare negli Appunti più cose. Quelle cose sarebbero accessibili da una chiave. È simile all'archiviazione locale HTML5. O qualcosa del genere non è possibile a causa della natura degli appunti?
Abdul,

Se riscontri errori con ASP.NET, prova a utilizzarlo in un nuovo thread: var thread = new Thread (param => {Clipboard.SetText (txtName.Text);}); thread.SetApartmentState (ApartmentState.STA); Thread.start ();
user3790692

1
La risposta di skia.heliou mi ha aiutato: dopo aver aggiunto l'attributo [STAThreadAttribute], il mio metodo Clipboard.SetText inizia a funzionare
viteo,

44

Per i progetti console in modo graduale, devi prima aggiungere il System.Windows.Formsriferimento. Le seguenti operazioni funzionano in Visual Studio Community 2013 con .NET 4.5:

  1. In Esplora soluzioni , espandere il progetto della console.
  2. Fare clic con il tasto destro del mouse su Riferimenti , quindi fare clic su Aggiungi riferimento ...
  3. Nel gruppo Assiemi , in Framework , selezionare System.Windows.Forms.
  4. Clicca OK .

Quindi, aggiungi la seguente usingdichiarazione con le altre nella parte superiore del codice:

using System.Windows.Forms;

Quindi, aggiungi una delle seguenti opzioni Clipboard. SetTextdichiarazioni al tuo codice:

Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);

E infine, aggiungi STAThreadAttributeal tuo Mainmetodo come segue, per evitare un System.Threading.ThreadStateException:

[STAThreadAttribute]
static void Main(string[] args)
{
  // ...
}

1
La classe StackOverflowExceptionprecede immediatamente STAThreadAttributenella libreria di classi di sistema .NET Framework =)
skia.heliou,

42

La mia esperienza con questo problema con l'uso di WPF C # coping negli appunti ed System.Threading.ThreadStateExceptionè qui con il mio codice che ha funzionato correttamente con tutti i browser:

Thread thread = new Thread(() => Clipboard.SetText("String to be copied to clipboard"));
thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
thread.Start(); 
thread.Join();

crediti per questo post qui

Ma questo funziona solo su localhost, quindi non provarlo su un server, poiché non funzionerà.

Sul lato server, l'ho fatto usando zeroclipboard. L'unico modo, dopo molte ricerche.


L'ho usato nel test automatico del selenio (webdriver) e funziona benissimo!
andrew.fox

@ andrew.fox l'hai provato sul tuo server - modello client? perché se si tratta di 2 macchine separate, suppongo che non dovrebbe funzionare.
BMaximus,

Lol no, Selenium apre la finestra del browser sul computer dell'agente.
andrew.fox

41
Clipboard.SetText("hello");

Per questo dovrai usare gli spazi dei nomi System.Windows.Formso System.Windows.


1

Clip.exe è un eseguibile in Windows per impostare gli appunti. Si noti che questo non funziona per altri sistemi operativi diversi da Windows, che fa ancora schifo.

        /// <summary>
        /// Sets clipboard to value.
        /// </summary>
        /// <param name="value">String to set the clipboard to.</param>
        public static void SetClipboard(string value)
        {
            if (value == null)
                throw new ArgumentNullException("Attempt to set clipboard with null");

            Process clipboardExecutable = new Process(); 
            clipboardExecutable.StartInfo = new ProcessStartInfo // Creates the process
            {
                RedirectStandardInput = true,
                FileName = @"clip", 
            };
            clipboardExecutable.Start();

            clipboardExecutable.StandardInput.Write(value); // CLIP uses STDIN as input.
            // When we are done writing all the string, close it so clip doesn't wait and get stuck
            clipboardExecutable.StandardInput.Close(); 

            return;
        }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.