C# Zwischenablage lässt sich nicht auslesen

AP Nova

Commander
Registriert
Juni 2008
Beiträge
2.256
Im Prinzip will ich einfach nur etwas Text aus der Zwischenablage auslesen und dann weiter damit arbeiten. Allerdings ist es egal, wie ich mich anstelle, für mein Programm ist die Zwischenablage schlichtweg leer.

"Console.WriteLine(Clipboard.GetText());" bringt mir eine leere Zeile, nehme ich einen Aufbau wie den folgenden bleibt das Objekt auf null stehen und die IDE beschwert sich weil ich mit einem Objekt, welches "null" ist, arbeiten will.
Code:
IDataObject CB = Clipboard.GetDataObject(); 
Console.WriteLine((string)CB.GetData(typeof(string)));

Ich bin mir 100%ig sicher, dass da Text in der Zwischenablage ist. Ein paar Buchstaben auswählen und dann in die Zwischenablage kopieren ist nun wirklich nicht so schwer.

Weiß irgendjemand Rat?

Danke für eure Hilfe

edit: Dank "using System.Windows.Forms;" ist keine volle "Pfadangabe" zum Clipboard hin notwendig, daran liegt es also nicht.
 
Möglichweiser hilft folgender Link ...
 
Klappt es so vielleicht?
Code:
(String)CB.GetData(DataFormats.Text)
 
Danke, mit "[STAThread]" vor der main-Methode funktioniert es nun so wie es soll.

Was genau ändert dieses "[STAThread]" und könnte das noch zu Problemen führen? (Anscheinend ist das nur im Debug-Modus notwendig?)

Nebenbei: Wo wählt man eigentlich zwischen Debug und Release Modus aus? Ich habe im Internet nach der Antwort gesucht aber nichts gefunden, nur einen Screen, bei dem das eigentlich da sein sollte, wo bei mir nichts ist.
 
Code:
Console.WriteLine( Clipboard.GetText() );
funzt 1a. um genau zu sein n kleines tool, was nur die zwischenablage bei mir behandelt:
Code:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace CopyToClipboard
{
  class Program
  {
    static void Main( string[] args )
    {
      if( args.Length == 0 )
        Console.WriteLine(
@"
Usage: CopyToClipboard.exe [<Text to copy> or <option> <Text to copy>]

  If you bypass only one parameter, the whole text in the first parameter is
  copied to the clipboard. You also have the option to switch between certain
  options. Be aware to surround the text parameter by quotations if the text
  containts whitespaces (especially spaces) or at least one ampersand (&).

Available options:

  plain         - copies the complete parameter to the clipboard (as you
                    bypass only one parameter to the application)
  filename      - extracts the filename of a file (with extension)
  filenamewoext - extracts the filename of a file (without extension)
  path          - extracts the path with a trailing separator character
  ext           - extracts the file extension
  extlower      - extracts the file extension and converts it to lowercase
  extupper      - same as above but uppercase"
          );
      else if( args.Length == 1 )
        Clipboard.SetText( args[0] );
      else if( args.Length == 2 )
        switch( args[0].ToLower() )
        {
          case "plain": Clipboard.SetText( args[1] ); break;
          case "filename": Clipboard.SetText( Path.GetFileName( args[1] ) ); break;
          case "filenamewoext": Clipboard.SetText( Path.GetFileNameWithoutExtension( args[1] ) ); break;
          case "path": Clipboard.SetText( Path.GetDirectoryName( args[1] ) + Path.DirectorySeparatorChar ); break;
          case "ext": Clipboard.SetText( Path.GetExtension( args[1] ).Replace( ".", "" ) ); break;
          case "extlower": Clipboard.SetText( Path.GetExtension( args[1] ).Replace( ".", "" ).ToLower() ); break;
          case "extupper": Clipboard.SetText( Path.GetExtension( args[1] ).Replace( ".", "" ).ToUpper() ); break;
        }
    }
  }
}
 
Also ich kann deinen Fehler nicht reproduzieren.

Ich hab jetzt mehrere Methoden ausprobiert und habe jeweils den Text wiederbekommen:

1) Clipboard.GetData(DataFormats.StringFormat).ToString();
2) Clipboard.GetText();
3) IDataObject obj = Clipboard.GetDataObject();
bla = obj.GetData(DataFormats.StringFormat Alternativ: typeof(string)).ToString();
Oder auch (string) vor obj. statt ToString()

Kopierst du vielleicht kein PlainText?
 
Wenn ich zum Beispiel im Texteditor ein paar Buchstaben eingebe und die kopiere wird das wohl schon reiner Text sein. Wie gesagt, mit dem "[STAThread]" vor der main-Methode funktioniert das. Vielleicht liegt es wirklich am Debug-Modus, wie ich eben gelesen habe? In dem Fall wüsste ich weiterhin gerne, wo man in Visual C# Studio 2010 Express vom Debug- in den Release-Modus umschalten kann.
 
Das bringt mir ehrlich gesagt nicht sehr viel. "Wiederherstellen" kann ich nur die Standardprofile ohne Schalter zwischen Release/Debuggen und die Variante, das selbst über 'Extras -> Anpassen' hinzuzufügen gestaltet sich gerade sehr schwer, nicht zuletzt, weil der den Drang hat, Befehle nicht hinzuzufügen, wenn man auf "Befehl hinzufügen" geht, einen Befehl auswählt und dann mit "OK" bestätigt. War zwar sowieso nur "Starten ohne Debuggen", aber das wäre besser als gar nichts gewesen.

edit: "Starten ohne Debugging" konnte ich mittlerweile hinzufügen, wo sich die Auswahloption findet wüsste ich aber trotzdem gerne.
 
Ehhhhmmmm, bin grad echt stutzig was für einen Schalter hättest Du gerne wofür ??? Benutze hier Visual Studio 2010 Ultimate ... keine Ahnung ob das in der Express anders sein könnte ??

Ahhhh ich glaube jetzt hab ichs ... die Eigenschaften der Profile kannst Du detailiert unter Projekt > "Name des Projekts Eigenschaften" festlegen ... habe eine englische Version und jetzt mal ins "unreine" übersetzt.

P.S. folgender Link führt zu einer "kurzweiligen" Diskussion und Sammlung zum Thema [STAThread]
 
Zuletzt bearbeitet: (Ergänzungen hinzugefügt)
Normalerweise soll wohl in der Symbolleiste "Standard" ein "Schalter" bzw. eine Möglichkeit sein, auszuwählen, ob man Release oder Debug erzeugen möchte. Bei mir ist diese Einstellmöglichkeit dank der standardmäßigen Visual Studio Einstellung nicht gegeben. (Finde ich auch sehr sinnvoll, jeden Blödsinn in die Symbolleisten zu laden, aber sowas zu entfernen)

Die Suche nach dieser Einstellmöglichkeit verlief leider erfolglos.

Und danke für den Link, endlich mal ein klares Wort zur Wirkung davon.
 
Einen LiNK hab ich als Nachtrag warum und weshalb STAThread dann doch noch ... aber eben nur zur Ergänzung :-)

P.S. ggf. Kannst Du am rechten Ende der Standard Menuleiste (Toolbar) mal auf das erweitern/hinzufügen klicken und über Schaltfläche hinzufügen/entfernen die entsprechenden Optionen wieder aktivieren
 
Zuletzt bearbeitet:
Ich müsste wissen, wo ich den Befehl unter "Befehl hinzufügen" zu suchen habe. Zumindest unter "Debuggen" fand ich nichts, was nach dem aussieht, was ich suche.
 
Vielleicht hilft schon der folgende Link (bezieht sich zwar auf VS Express für Windows Phone wird aber denke ich das gleiche sein) ... ist augenscheinlich doch etwas anders in der Express Version
 
Danke, über den Link habe ich jetzt wenigstens den notwendigen Hinweis erhalten.

Dass sich das unter "Erstellen" versteckt hätte ich mir eigentlich auch denken können, allerdings wäre ich ohne "Solution Configurations" wohl kaum auf die Idee gekommen, dass es so etwas wie "Projektmappenkonfigurationen" sein könnte. Damit wäre das nun also auch geklärt.
 
versuch mal mit:
using (streamReader r = File.OpenText("filename"))
CB = r.ReadLine();
.
.
damit solltest du die Zeile auslesen un in einen array speicher können.
 
Du hast aber schon mitbekommen, dass ich schon längst eine Lösung habe? ("[STAThread]")
 
Zurück
Oben