Autor Beitrag
Maldö
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Fr 14.01.11 17:01 
Hi!

Habe folgendes Problem:


Ich möchte den Text aus der Zwischenablage nutzen, der in URL Format ist.

Leider zeigt er mir bei Clipboard.GetText(); nur ein leeres Ergebnis an...


Kann mir jemand sagen, wie ich das richtig auslesen?


Vielen Dank im Vorraus


Malte
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 14.01.11 18:25 
Falls Text nicht akzeptiert wird, versuche folgendes:
MSDN hat folgendes geschrieben:

Rufen Sie GetDataObject auf, um Daten aus der Zwischenablage abzurufen. Die Daten werden als Objekt zurückgegeben, das die IDataObject-Schnittstelle implementiert. Verwenden Sie die durch IDataObject angegebenen Methoden sowie Felder in DataFormats, um die Daten aus dem Objekt zu extrahieren. Wenn Ihnen das Format der abgerufenen Daten nicht bekannt ist, rufen Sie die GetFormats-Methode der IDataObject-Schnittstelle auf, um eine Liste aller Speicherformate dieser Daten zu erhalten. Rufen Sie anschließend die GetData-Methode der IDataObject-Schnittstelle auf, und geben Sie ein Format an, das von der Anwendung unterstützt wird.
...

s.a msdn.microsoft.com/d...forms.clipboard.aspx

P.S: Von welcher Anwendung aus kopierst du denn die URL?
Maldö Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Fr 14.01.11 20:43 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Falls Text nicht akzeptiert wird, versuche folgendes:
MSDN hat folgendes geschrieben:

Rufen Sie GetDataObject auf, um Daten aus der Zwischenablage abzurufen. Die Daten werden als Objekt zurückgegeben, das die IDataObject-Schnittstelle implementiert. Verwenden Sie die durch IDataObject angegebenen Methoden sowie Felder in DataFormats, um die Daten aus dem Objekt zu extrahieren. Wenn Ihnen das Format der abgerufenen Daten nicht bekannt ist, rufen Sie die GetFormats-Methode der IDataObject-Schnittstelle auf, um eine Liste aller Speicherformate dieser Daten zu erhalten. Rufen Sie anschließend die GetData-Methode der IDataObject-Schnittstelle auf, und geben Sie ein Format an, das von der Anwendung unterstützt wird.
...

s.a msdn.microsoft.com/d...forms.clipboard.aspx

P.S: Von welcher Anwendung aus kopierst du denn die URL?


Danke...ich kriege leider noch keinen einzigen Wert raus... bei getDataObject sagt er andauernd es wär null und wenn ich probiere die zuvor kopierte URL als DataFormat.StingFormat auszulesen oder .Text gibt er ebenfalls null zurück.



Anbei mein Code.


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
   private void GetFormats1()
        {
            IDataObject iData = Clipboard.GetDataObject();
            if (iData != null) {

                string[] fs = iData.GetFormats();
                for (int z = 0; z < fs.Length; z++) {

                    MessageBox.Show(fs[z]);
                
                }
            
            
            }
        }



string thetext = null;
 IDataObject iData = Clipboard.GetDataObject();
if(iData.GetDataPresent(DataFormats.Text)) thetext = (String)iData.GetData(DataFormats.Text); 

MessageBox.Show(thetext);

PS: mit den getFormats hab ichs probiert, leider ebenfalls ohne erfolg :(
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Fr 14.01.11 23:13 
Eigentlich ist doch die URL in der Zwischenablage ein ganz normaler string, oder irre ich mich da?
Dann müsste es doch mit
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
{
  string data = (String)iData.GetData(DataFormats.Text); 
}
funktionieren.
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
P.S: Von welcher Anwendung aus kopierst du denn die URL?
Ja, die Frage ist da wirklich berechtigt, denn mit URL's von normalen Anwendungen (Firefox, Opera, ...) funktioniert es. Kann es sein, dass die Anwendung die URL nicht in die Zwischenablage kopiert, bzw. eine eigene Zwischenablage besitzt? Kannst Du denn die kopierte URL woanders wieder einfügen (z.B. im Editor)?
Maldö Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Fr 14.01.11 23:17 
user profile iconTrashkid2000 hat folgendes geschrieben Zum zitierten Posting springen:
Eigentlich ist doch die URL in der Zwischenablage ein ganz normaler string, oder irre ich mich da?
Dann müsste es doch mit
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
IDataObject iData = Clipboard.GetDataObject();
if (iData.GetDataPresent(DataFormats.Text))
{
  string data = (String)iData.GetData(DataFormats.Text); 
}
funktionieren.
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
P.S: Von welcher Anwendung aus kopierst du denn die URL?
Ja, die Frage ist da wirklich berechtigt, denn mit URL's von normalen Anwendungen (Firefox, Opera, ...) funktioniert es. Kann es sein, dass die Anwendung die URL nicht in die Zwischenablage kopiert, bzw. eine eigene Zwischenablage besitzt? Kannst Du denn die kopierte URL woanders wieder einfügen (z.B. im Editor)?


genau die art habe ich probiert, da sagt er mir immer an dass IData null wär bzw nicht zur einer Objektsinstanz definiert wurde etc...


Ich kopiere die URL aus firefox...und auch bei normal kopierten URLs funktioniert es leider nicht...hat es damit zu tun dass das ganz in einen Thread läuft?
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Fr 14.01.11 23:47 
user profile iconMaldö hat folgendes geschrieben Zum zitierten Posting springen:
hat es damit zu tun dass das ganz in einen Thread läuft?

Gut zu wissen. Soviel ich weiß und gelesen habe, muss der Clipboard aus einen STA-Thread gelesen werden. Mit dieser Seite als Beispiel stackoverflow.com/qu...ns-null-empty-string würde sich also für einen eigenen Thread folgender Code ergeben:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Thread staThread = new Thread(delegate()
  {
    IDataObject iData = null;
    while (true)
    {
      iData = Clipboard.GetDataObject();
      if (iData.GetDataPresent(DataFormats.Text))
      {
        Console.WriteLine(iData.GetData(DataFormats.Text));
      }
      Thread.Sleep(1000);    
    }
  });
staThread.SetApartmentState(ApartmentState.STA);
staThread.Start();
So müsste es funktionierten.

Für diesen Beitrag haben gedankt: Maldö
Maldö Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24



BeitragVerfasst: Sa 15.01.11 01:54 
funzt besten dank
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Sa 15.01.11 02:53 
Klasse, das so wichtige Infos erstmal zurückgehalten werden...

Nur ein paar Zeilen unter obigen Zitat steht übrigens auch:
Zitat:

Die Clipboard-Klasse kann nur in Threads verwendet werden, für die der STA-Modus (Single Thread Apartment) aktiviert wurde. Um diese Klasse zu verwenden, stellen Sie sicher, dass die Main-Methode mit dem STAThreadAttribute-Attribut gekennzeichnet ist.

:wink: