Страница 1 из 1

Работа с Clipboard

Добавлено: 26 Август 2015, 20:02
Губин Игорь
Потребовалось обеспечить корректное занесение в Clipboard кириллицы на любых виндах с любой кодировкой

Вариант с переформатированием в RTF и отображением в окне оказался не самым удобным. Пришлось родить функцию. Она, конечно, недолизана и заточена под кириллицу, но помещает в буфер текст в кодировке Юникод. Далее всё всем и так понятно. Не пилите за оформление, лень долизовать, переводить в класс и т.п. (у себя я уже вставил куда надо и как надо)

Код: Выделить всё

  PROGRAM

    Include('svapi.inc'),once
                    MAP
    			StringToClipBoard(String)
                        module('CW_API')
                            memcpy(long,long,long),raw,name('_memcpy')
			End
        Include('svapifnc.inc'),ONCE
    END

TestString          String(1024)

  CODE

    TestString = 'Проверка Clipboard с юникодом'
    StringToClipboard(TestString)
        
StringToClipBoard  Procedure(InpString) 

UnicodeText                             String(2*Size(InpString)+2)
L                                       Long
I                                       Long

loc:RetrievedHandle Long

    CODE

        IF OpenClipboard(0{PROP:AppInstance}) Then
        
            I = Len(Clip(InpString))
            L = Size(UnicodeText)
            Clear(UnicodeText,0)
            If MultiByteToWideChar(1251,0,Address(InpString),I,Address(UnicodeText),L).
            UnicodeText[ L-1 : L] = '<0><0>'

            IF EmptyClipboard()
                loc:RetrievedHandle = GlobalAlloc(GMEM_DDESHARE,L)
                memcpy(GlobalLock(loc:RetrievedHandle),address(UnicodeText),L)
                x# = GlobalUnlock(loc:RetrievedHandle)
                x# = SetClipboardData(CF_UNICODETEXT,loc:RetrievedHandle) THEN
                x# = GlobalFree(loc:RetrievedHandle)
        	CloseClipboard()
    	  END