Autor Beitrag
Äfan
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 29.07.10 12:07 
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
der direktlink zu den sources für den server und den client: Sources

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

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:
        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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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. www.mycsharp.de/wbb2...d.php?threadid=33113
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 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).