Avatar billede torving Nybegynder
22. april 2006 - 14:29 Der er 14 kommentarer og
1 løsning

Unmanaged C# Clipboard Problemer

Jeg har er lille problem. Følgende kode placere første karakter i strengen val
på clipboardet men ikke resten.

string val = "test";
IntPtr h = NativeWin32API.NativeWin32API.GlobalAlloc(NativeWin32API.NativeWin32API.GlobalMemoryFlags.GPTR,new UIntPtr((uint)(val.Length+1)));
IntPtr g = NativeWin32API.NativeWin32API.GlobalLock(h);
Marshal.Copy(val.ToCharArray(), 0, g, val.Length);

NativeWin32API.NativeWin32API.GlobalUnlock(h);
NativeWin32API.NativeWin32API.OpenClipboard(IntPtr.Zero);
NativeWin32API.NativeWin32API.EmptyClipboard();
NativeWin32API.NativeWin32API.SetClipboardData(NativeWin32API.NativeWin32API.CF_FORMATS.CF_TEXT, h);
NativeWin32API.NativeWin32API.CloseClipboard();

//-----------NativeWin32API.cs--------------------
[DllImport("kernel32.dll")]
        public static extern IntPtr GlobalAlloc(GlobalMemoryFlags uFlags, UIntPtr dwBytes);
       
[DllImport("kernel32.dll")]
        public static extern IntPtr GlobalLock(IntPtr hMem);
       
[DllImport("kernel32.dll")]
        public static extern bool GlobalUnlock(IntPtr hMem);

[DllImport("user32.dll")]
        public static extern bool OpenClipboard(IntPtr hWndNewOwner);

[DllImport("user32.dll")]
        public static extern bool EmptyClipboard();

[DllImport("user32.dll")]
        public static extern IntPtr SetClipboardData(  CF_FORMATS uFormat,
                                                IntPtr hMem);

[DllImport("user32.dll")]
        public static extern bool CloseClipboard();
       
Det ville være rart hvis nogen kunne hjælpe mig med at finde ud af hvad der går galt.

MVH

Tørving
Avatar billede torving Nybegynder
22. april 2006 - 14:31 #1
Forresten hvis jeg sætter DLLAttributtens SetLastError Parameter til true på de forskellige native metode kald så for jeg winerror.h fajl kode 2 hviklet svare til ERROR_FILE_NOT_FOUND.. I am clueless.. Please help me
Avatar billede arne_v Ekspert
22. april 2006 - 14:39 #2
et par skud i tågen:

A)

du skal have sat den terminerende nul byte

B)

(val.Length+1)

skal være

(2*val.Length+2)
Avatar billede arne_v Ekspert
22. april 2006 - 14:39 #3
evt. skal de kombineres
Avatar billede torving Nybegynder
22. april 2006 - 15:02 #4
Virker desværre ikke.
Avatar billede torving Nybegynder
22. april 2006 - 15:07 #5
Ovenstående kode har jeg sammensat for overskueligheds årsager, her er den kode jeg sidder med. Måske afsløre den tydeligere hvad jeg gør galt.
private static void SetClipboardText(string val)
        {
           
            IntPtr hWnd = NativeWin32API.NativeWin32API.GetOpenClipboardWindow();           
           
            if(NativeWin32API.NativeWin32API.OpenClipboard(hWnd))
            {
                NativeWin32API.NativeWin32API.EmptyClipboard();
                IntPtr hCBData = NativeWin32API.NativeWin32API.SetClipboardData(NativeWin32API.NativeWin32API.CF_FORMATS.CF_TEXT, StringToPointer(val));
                int wErrorCode = NativeWin32API.NativeWin32API.GetLastError();
                Console.WriteLine(wErrorCode);
                NativeWin32API.NativeWin32API.CloseClipboard();
            }
            Console.ReadLine();
        }

        private static IntPtr StringToPointer(string val)
        {
            if(val == null)
            {
                return (IntPtr.Zero);
            }
            //Calculate the number of bytes occupied by the string (char = 2 bytes)
            uint bSize = (uint)((val.Length + 1) * 2);
            //Allocate the specified number of bytes on the heap and initialize them to zero
            IntPtr hStrVal = NativeWin32API.NativeWin32API.GlobalAlloc(NativeWin32API.NativeWin32API.GlobalMemoryFlags.GPTR,
                                                                      new UIntPtr(bSize));
            if(hStrVal == IntPtr.Zero)
                throw new OutOfMemoryException();           
            IntPtr pClipboardData = NativeWin32API.NativeWin32API.GlobalLock(hStrVal);

            Marshal.Copy(val.ToCharArray(), 0, pClipboardData, val.Length);
           
           
            NativeWin32API.NativeWin32API.GlobalUnlock(pClipboardData);

            return hStrVal;
        }
Avatar billede arne_v Ekspert
22. april 2006 - 15:19 #6
nu har jeg læst lidt

prøv og skift CF_TEXT med CF_UNICODETEXT
Avatar billede arne_v Ekspert
22. april 2006 - 15:20 #7
eller behold CF_TEXT og erstat val.ToCharArray() med Encoding.Default.GetBytes(val)
Avatar billede torving Nybegynder
22. april 2006 - 15:23 #8
Hvor læste du det...? Jeg har læst og læst. Men har ikke kunne finde nogen informationer som kunne hjælpe mig.. Nu virker det..Kom med et svar du for dine yderst velfortjente point.

Mange Tak
Avatar billede arne_v Ekspert
22. april 2006 - 15:25 #9
svar
Avatar billede torving Nybegynder
22. april 2006 - 15:25 #10
PS. så var det Encoding.Default.GetBytes(val) der gjorde forskellen..
Avatar billede arne_v Ekspert
22. april 2006 - 15:26 #11
her: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/dataexchange/clipboard/clipboardreference/clipboardfunctions/setclipboarddata.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/dataexchange/clipboard/clipboardformats.asp

CF_TEXT    Text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data. Use this format for ANSI text.

CF_UNICODETEXT    Windows NT/2000/XP: Unicode text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data.
Avatar billede arne_v Ekspert
22. april 2006 - 15:27 #12
CF_TEXT forventer 1 byte per bogstav

CF_UNICODETEXT forventer 2 bytes perbogstav

Encoding.Default.GetBytes(val) returnerer 1 byte per bogstav

val.ToCharArray() returnerer 2 bytes per bogstav
Avatar billede torving Nybegynder
22. april 2006 - 15:28 #13
Du aner ikke hvor megen hovedpine du har redet mig for.Tak for dine informationer de har været yderst nyttige..
Avatar billede kvinther Nybegynder
25. april 2006 - 09:05 #14
Er det et ufravigeligt krav, at det skal være unmanaged?!

Ellers:

string test = "Some Text";
System.Windows.Forms.Clipboard.SetDataObject(test.Substring(0, 1));
Avatar billede torving Nybegynder
25. april 2006 - 09:12 #15
Ja.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester