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