Gå til innhold

Data til Clipboard (løst)


Anbefalte innlegg

Skrevet (endret)

Lager med vb.net en applikasjon for pocket pc (windows mobile 5) der jeg skal sende data til clipboard med:

 

Clipboard.SetDataObject("Test data")

 

Imidlertid, jeg får feilmeldingen: "Gjeldende tråd må være satt til STA-modus før OLE kall kan utføres. Sørg for at det er merket av for STAThreadAttribute i din Main-funksjon".

 

Kunne noen si hvordan jeg konkret må gjøre dette? Kjører Framework 2, Visual Studio 2005.

Endret av backup
Videoannonse
Annonse
Skrevet (endret)

Det skal stå

 

C#:

[STAThread]
public static void Main()

 

VB:

<STAThread()> _
Public Shared Sub Main()

 

i starten av koden din...

 

Hva med å bruke msdn og feilmeldingen litt?

Endret av Manfred
Skrevet
Det skal stå

 

C#:

[STAThread]
public static void Main()

 

VB:

<STAThread()> _
Public Shared Sub Main()

 

i starten av koden din...

 

Hva med å bruke msdn og feilmeldingen litt?

7236622[/snapback]

 

 

Med denne innsatt:

 

<STAThread()> _

Public Shared Sub Main()

Application.Run(Form1)

End Sub

 

får jeg meldingen at 'STAThread' is not defined, og at jeg skal sette inn 'MTAThread' i stedet, men med

 

<MTAThread()> _

Public Shared Sub Main()

Application.Run(Form1)

End Sub

 

får jeg imidlertid den samme feilmeldingen, dvs "Gjeldende tråd må være satt til STA-modus før OLE kall kan utføres. Sørg for at det er merket av for STAThreadAttribute i din Main-funksjon".

Skrevet

Var borti samme problemstilling men for en vanlig WinApp. Da brukte jeg winapi istedet med DllImport for å få til det jeg ville.

 

Om noen vet noen måte å bruke clipboard objektet i .Net uten å ha en STAThread (single threaded application) løsning så hadde det vært fint å vite. Noen ganger ønsker man jo å sette clipboard info i en tråd.

 

Har Pocket PC tilgang til samme api på noe vis? I så tilfelle kan du prøve dette:

    public class Win32ClipBoard {
       public enum Formats {
           CF_TEXT = 1,
           CF_BITMAP = 2,
           CF_METAFILEPICT = 3,
           CF_SYLK = 4,
           CF_DIF = 5,
           CF_TIFF = 6,
           CF_OEMTEXT = 7,
           CF_DIB = 8,
           CF_PALETTE = 9,
           CF_PENDATA = 10,
           CF_RIFF = 11,
           CF_WAVE = 12,
           CF_UNICODETEXT = 13,
           CF_ENHMETAFILE = 14
       }

       //[DllImport("User32.dll")]public static extern int GetClipboardOwner();

       [DllImport("user32.dll")]
       static extern bool OpenClipboard(IntPtr hWndNewOwner);
       [DllImport("user32.dll")]
       static extern bool EmptyClipboard();
       [DllImport("user32.dll")]
       static extern IntPtr SetClipboardData(Formats uFormat, IntPtr hMem);
       [DllImport("user32.dll")]
       static extern bool CloseClipboard();

       public static void SetClipboardText(string text) {
           IntPtr hClipboard = IntPtr.Zero;
           IntPtr hInstance = IntPtr.Zero;
           if (OpenClipboard(hInstance)) {
               IntPtr unmanagegstring = Marshal.StringToCoTaskMemAnsi(text);
               EmptyClipboard();
               SetClipboardData(Formats.CF_TEXT, unmanagegstring);
               CloseClipboard();
           } else {
               //Ignore...
           }
       }

   }

Skrevet

Det fine med winapi er at du kan slippe deg løs fra .Net sin til tider lammende begrensninger. Som f.eks at .Net krever at Clipboard kalles fra STAThread.

 

Ulempen er at f.eks nyere operativsystemer kan komme i konflikt da winapi'et kan endre seg med OS.

Skrevet

Takker for alle svar. Løste problemet med først Clipboard.Clear og så Clipboard.SetText i OpenNetCF. Problemet vedvarte i emulatoren, men forsvant på pocket pc'en.

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...