Entwickler-Ecke

WinForms - Anfrage über Socket => Kein Zugriff auf Zwischenablage


Delete - Do 29.07.10 12:07
Titel: Anfrage über Socket => Kein Zugriff auf Zwischenablage
hallöchen,

wie in einem anderen thread geschrieben, baue ich ein tool, dass die zwischenablage ausliest und wenn ein bild vorhanden ist, wird dieses gespeichert.

nun will ich das, das auf einem server eine anwendung läuft, diese sendet ein flag an den client. der client wertet dieses flag aus und weiß, das er nun in die zwischenablage schauen soll und wenn ein bild drin liegt, soll er dieses an den server zurückschicken, der das bild bzw. die daten dann in eine datei abspeichert.

das versenden des flags habe ich über sockets realisiert und das zurücksenden der bilddaten soll auf selben wegen funktionieren.

jetzt habe ich aber das problem, das wenn der server das flag an den client sendet und ich darauf hin meine funktion (CheckClipboard()) aufrufe, die die zwischenablage durchsucht, bekomme ich keine daten, da die zwischenablage leer zu sein scheint, obwohl definitiv bilddaten drin liegen und ich diese auch in einem anderen programm einfügen kann. Clipboard.ContainsImage() gibt mir in dem fall false zurück

rufe ich meine funktion direkt über einen button auf, funktionierts. nur über die funktion der sockets gehts scheinbar nicht.

hier der link zu dem tutorial das ich für die socket kommunikation verwende: Tutorial [http://www.codeguru.com/csharp/csharp/cs_network/sockets/article.php/c7695]
der direktlink zu den sources für den server und den client: Sources [http://www.codeguru.com/dbfiles/get_file/async_client_server_src.zip?id=7695&lbl=ASYNC_CLIENT_SERVER_SRC_ZIP&ds=20051006]

meine relevanten stellen sind die folgenden (der rest steht in den sources):


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
        public void OnDataReceived(IAsyncResult asyn)
        {
            try
            {
                SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
                int iRx = theSockId.thisSocket.EndReceive(asyn);
                CheckClipboard();
                WaitForData();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }      

       private void CheckClipboard()
        {
            if (Clipboard.ContainsImage())
                 MessageBox.Show("bildchen, juhu!!!");
            else 
           MessageBox.Show("keine bilder :(");
       }



kann mir jemand sagen wieso ich hier keine daten aus der zwischenablage bekomme?

danke


Th69 - Do 29.07.10 12:26

Läuft die OnDataReceived-Methode in einem anderen Thread? Dann kann es evtl. nötig sein, daß du mittels "Invoke" in den Mainthread wechseln mußt.

Weitere Infos hierzu s. http://www.mycsharp.de/wbb2/thread.php?threadid=33113


Ralf Jansen - Do 29.07.10 13:04

Ein AsyncCallback wird so weit ich weiß in einem Threadpool Thread ausgeführt. Diese Threads laufen im Multithreaded Apartment(MTA) darum wirst wohl auch in dieses [http://www.c-sharp-forum.de/viewtopic.php?t=100642] Problem laufen. Du musst zwingend den Clipboard Aufruf aus einem STA Thread ausführen (z.B. dem Hauptthread der sollte Standardmäßig ein STA Thread sein, siehe auch entsprechendes Attribut an der Main Methode).