Clipboard Problem VB.Net und Multithreading

Hi Leute,

mein Programm kopiert per Senden von [Strg]+C Daten. Das funktioniert auch alles soweit. Das Problem ist, dass die Anwendung, die ich gemacht habe, multithread-fähig und somit nicht in der Lage ist, die Zwischenablage auszulesen.
Jedes mal wenn ich per Clipboard.GetData(…) oder My.Computer.Clipboard.GetData versuche, etwas aus der Zwischenablage zu holen, wird mir eine Fehlermeldung ausgegeben, dass dies nicht ginge, weil es keine „Single-Thread-Application“ (STA) ist.
Nun brauche ich dies aber unbedingt und möchte gerne wissen, ob es möglich ist, Daten aus der Zwischenablage für eine multithread-fähige Anwendung zu kopieren.
Bin euch echt dankbar für jede Antwort, hab mich schon tot-gegooglet :wink:

MfG Chris

Hallo,

Ich weiß nicht, ob du eine Main()-Funktion hast (wenn das Anwendungsframework in den Projekteinstellungen aktiviert ist, blendet VB.NET diese ja aus), aber vor diese müsstest du das -Attribut schreiben:

_
Private Shared Sub Main()

End Sub

Also wenn du diese Methode schon hast, einfach das Attribut davor schreiben und ansonsten die Methode in irgendeine Klasse einfügen, in den Projekteinstellungen das Anwendungsframework deaktivieren und als Startobjekt „Sub Main“ wählen. Dann müsste es funktionieren - zumindest wird die Fehlermeldung nicht mehr kommen. Ich hab das schnell mal ausprobiert - allerdings erhalte ich dann nur im Hauptthread den Inhalt der Zwischenablage - in den anderen bekomme ich nur Nothing zurück. Das Clipboard.GetData müsste dann immer im Hauptthread ausgeführt werden. Hättest du im Hauptthread nun ein Formular, könntest du auf einem Steuerelement Button1.Invoke() aufrufen - da das allerdings nicht der Fall sein wird, würde etwas in dieser Richtung hier gehen:

Imports System.Threading

Public Class MainClass
Private Shared MainWaitHandle As New EventWaitHandle(False, EventResetMode.AutoReset)
Private Shared Bags As New List(Of Bag)

Public Shared Sub Main()
Dim invoker As New MethodInvoker(AddressOf IchBinEinAndererThread)
invoker.BeginInvoke(Nothing, Nothing)

Do
MainWaitHandle.WaitOne()

SyncLock Bags
For Each OneBag As Bag In Bags
OneBag.ClipboardData = Clipboard.GetText
OneBag.WaitHandle.Set()
Next

Bags.Clear()
End SyncLock
Loop
End Sub

Private Shared Sub IchBinEinAndererThread()
Thread.Sleep(2000)

MsgBox(GetClipboardText)
End Sub

Private Shared Function GetClipboardText() As String
Dim MyBag As New Bag

SyncLock Bags
Bags.Add(MyBag)
End SyncLock

MainWaitHandle.Set()

MyBag.WaitHandle.WaitOne()
Return MyBag.ClipboardData
End Function
End Class

Public Class Bag
Public ClipboardData As String
Public WaitHandle As New EventWaitHandle(False, EventResetMode.ManualReset)
End Class

Grüße,
Randy