Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Получить HTML данные из буфера (число прочтений - 8920 )
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Получить HTML данные из буфера
11. Марта 2014 :: 16:47
Печать  
Возникла задача получить данные из буфера обмена в виде HTML кода. Например, при копировании в буфер таблицы из Outlook.

Попробовал использовать код отсюда: http://www.forum.mista.ru/topic.php?id=508248

Но возращает все время пустую строку. Что первый, что второй код.

Может какие-то ограничения по правам имеются для эксплорера по работе с буфером?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #1 - 11. Марта 2014 :: 17:53
Печать  
Пока обнаружилось то, что код не работает при запуске из удаленного (терминального) приложения. Не в терминале, как сессии. А именно в приложении. Так, у нас Тотал запускается как удаленное прилолжение. И вот в нем-то и не работает код.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #2 - 12. Марта 2014 :: 14:51
Печать  
Засада еще в том, что метод getData не умеет считывать из буфера HTML версию буфера. Только text и url....
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Получить HTML данные из буфера
Ответ #3 - 13. Марта 2014 :: 07:06
Печать  
А сопоставление буферов обмена то хоть включено ?..
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #4 - 13. Марта 2014 :: 15:39
Печать  
В терминале? Да. Конечно. В любое другое место текст вставляется.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
selesta
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 26. Июня 2012
Re: Получить HTML данные из буфера
Ответ #5 - 25. Марта 2014 :: 07:19
Печать  
пример можеш сделать, немогу понять что не получается
я через буфер (методом ИЕ) забираю в 1с целые масивы данных (ексель таблицы) вместо написание импорта методом создания объекта Ексель и чтения файла
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #6 - 27. Марта 2014 :: 13:35
Печать  
Как пример могу дать ссылку на утилитку "FreeClipboardViewer" http://freeclipboardviewer.com/windowsclipboard.html, которая показывает разные составляющие Буфера. Так вот, если скопировать в буфер данные с html страницы, в этой утилите появляется раздел "HTML формат". Вот до этого раздела я и хочу достучаться. Как вариант - попробовать вытащить эти данные через WinAPI.
  

FreeClipboardView.jpg ( 81 KB | Загрузки )
FreeClipboardView.jpg

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
selesta
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 11
Зарегистрирован: 26. Июня 2012
Re: Получить HTML данные из буфера
Ответ #7 - 08. Апреля 2014 :: 12:01
Печать  
копаться дальше некогда, к сожалению, но думаю нада смотреть в сторону метода GetClipboardData из user32.dll используя dynwrap
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #8 - 09. Апреля 2014 :: 14:14
Печать  
Вот вариант:

Код
Выбрать все
	WinAPI = СоздатьОбъект("DynamicWrapperX");
	WinAPI.Register("USER32.DLL", "OpenClipboard", "i=l", "r=l");    
	WinAPI.Register("USER32.DLL", "GetClipboardData", "i=l", "r=l");    
	WinAPI.Register("USER32.DLL", "CloseClipboard", "r=l");
	WinAPI.Register("KERNEL32.DLL", "GlobalLock", "i=l", "r=l");
	WinAPI.Register("KERNEL32.DLL", "GlobalUnlock", "i=l", "r=l");
        WinAPI.Register("KERNEL32.DLL", "GlobalSize", "i=l", "r=l");
	WinAPI.Register("USER32.DLL", "RegisterClipboardFormatA", "i=s", "r=l");

	WinAPI.OpenClipboard(0);

	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;
	CF_HDROP = 15;
	CF_LOCALE = 16;
	CF_MAX = 17;

//	Для Ст=1 По 17 Цикл
//		hClipMemory =  WinAPI.GetClipboardData(Ст);
//		lSize = WinAPI.GlobalSize(hClipMemory);
//		Сообщить(Строка(Ст)+"  " + Строка(lSize));
//	КонецЦикла;
	//wFormat=7;
	wFormat = WinAPI.RegisterClipboardFormatA("HTML Format"); //Rich Text Format
	Дескриптор = WinAPI.GetClipboardData(wFormat);
	lSize = WinAPI.GlobalSize(Дескриптор);
	Сообщить("Размер содержимого в HTML Format :: " + Строка(lSize));

	Если Дескриптор <> 0 Тогда
		Указатель = WinAPI.GlobalLock(Дескриптор);
		Результат = WinAPI.StrGet(Указатель, "s");
		WinAPI.GlobalUnlock(Дескриптор);
	Иначе
		Результат = "";
	КонецЕсли;
	WinAPI.CloseClipboard();
	Сообщить("Результат = "+Результат);
 

  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #9 - 11. Апреля 2014 :: 12:59
Печать  
Всё бы хорошо, но вот содержимое для HTML Format вставляется по умолчанию в кодировке charset=utf-8. И, естественно, получить это значение в 1С в нормально виде не получается.... Печаль.....
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #10 - 11. Апреля 2014 :: 16:31
Печать  
alyuev писал(а) 11. Апреля 2014 :: 12:59:
Всё бы хорошо, но вот содержимое для HTML Format вставляется по умолчанию в кодировке charset=utf-8. И, естественно, получить это значение в 1С в нормально виде не получается.... Печаль.....

а в чем проблема? что не получается?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #11 - 13. Апреля 2014 :: 08:32
Печать  
Не получается прочитать данные из буфера в формате utf-8 в 1С. Русский текст получается в абракадабре.

Просто когда нажимаю Ctrl+C в Outlook (что-то хочу скопировать в буфер), то он вставляет значение в буфер HTML Format в кодировке UTF-8. И соответственно вычитать это значение из буфера в 1С в нормальном виде не получается.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #12 - 14. Апреля 2014 :: 07:04
Печать  
Ну так ты сам говоришь WinAPI, что читать строку надо как ANSI (1251):

WinAPI.StrGet(Указатель, "s");

Улыбка
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #13 - 14. Апреля 2014 :: 08:03
Печать  
Вот что получаю, когда читаю в ANSI ".... mso-bidi-font-weight:bold'>КонтЛицаМенеджерТелефоны</span>...... "   (на самом деле у меня вместо К - PSPё - см. в скриншоте)

А если прочитать так, WinAPI.StrGet(Указатель) , то ответ выглядит так: "???????????????????????????????????????????????????????????????????????"
  

ANSI.jpg ( 22 KB | Загрузки )
ANSI.jpg

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: Получить HTML данные из буфера
Ответ #14 - 14. Апреля 2014 :: 09:28
Печать  
Код
Выбрать все
	Сообщить("Результат = "+Результат);

	BinData = СоздатьОбъект("BinaryData");
	BinData.Кодировка = 0;
	BinData.ЗаписатьСтроку(Результат,1);
	Рез = ""; Стр = "";
	BinData.Кодировка = 3;
	BinData.Перейти(0,0);
	Пока BinData.ПрочитатьСтроку(Стр,0) = 1 Цикл
		Рез=Рез+Стр+РазделительСтрок;
	КонецЦикла;
	Сообщить("Результат = "+СокрЛП(Рез));
	BinData.Close();
 

  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #15 - 14. Апреля 2014 :: 09:52
Печать  
Ещё варианты:
  • ADODB.Stream
    Код
    Выбрать все
    Стрим = Новый COMОбъект("ADODB.Stream");
    Стрим.Mode     = 3;
    Стрим.Type     = 2;
    Стрим.Charset  = "windows-1251";
    Стрим.Open();
    Стрим.WriteText(Строка1251, 0);
    Стрим.position = 0;
    Стрим.Charset  = "utf-8";
    СтрокаUTF8 = Стрим.ReadText(-1);
    Стрим.Close();
     
    
    
  • 1Cv8, входной параметр - COMSafeArray беззнаковых байтов
    Код
    Выбрать все
    Функция Раскодировать(m)
    	м = m.Выгрузить();
    
    	s = "";
    	For I = 0 To м.ВГраница() Do
    		c = м[I];
    		If Int(c / 8) = 30 Then // 4-byte
    			I = I + 3;
    			c = (c %  8) * 262144 + (м[I - 2] % 64) * 4096 + (м[I - 1] % 64) * 64 + м[I] % 64;
    		ElsIf Int(c / 16) = 14 Then // 3-byte
    			I = I + 2;
    			c = (c % 16) * 4096 + (м[I - 1] % 64) * 64 + м[I] % 64;
    		ElsIf Int(c / 32) = 6 Then // 2-byte
    			I = I + 1;
    			c = (c % 32) * 64 + м[I] % 64;
    		ElsIf c = 0 Then
    			Break;
    		EndIf;
    		s = s + Char(c);
    	EndDo;
    
    	Return s;
    КонецФункции 
    
    


Улыбка
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #16 - 14. Апреля 2014 :: 10:44
Печать  
leov-001, Спасибо!

получилось!
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Получить HTML данные из буфера
Ответ #17 - 14. Апреля 2014 :: 14:14
Печать  
Как результат:

Код
Выбрать все
Функция ВзятьИзБуфера(ТипБуфера="",ПерекодироватьвWin1251=0,ВывестиИменаБуферов=0)
//Стандартные форматы для ТипБуфера можно посмотреть здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms649013(v=vs.85).aspx
//Другие (именованные) форматы можно подсмотреть в программе http://freeclipboardviewer.com/
	Перем оЕстьВБуфере,Рез,BinData;
	WinAPI = СоздатьОбъект("DynamicWrapperX");
	WinAPI.Register("USER32.DLL", "OpenClipboard"	, "i=l", "r=l");    
	WinAPI.Register("USER32.DLL", "GetClipboardData", "i=l", "r=l");    
	WinAPI.Register("USER32.DLL", "CloseClipboard"	, "r=l");
	WinAPI.Register("KERNEL32.DLL", "GlobalLock"	, "i=l", "r=l");
	WinAPI.Register("KERNEL32.DLL", "GlobalUnlock"	, "i=l", "r=l");
        WinAPI.Register("KERNEL32.DLL", "GlobalSize"	, "i=l", "r=l");
	WinAPI.Register("USER32.DLL", "RegisterClipboardFormatA", "i=s"	, "r=l");
	WinAPI.Register("USER32.DLL", "EnumClipboardFormats"	, "i=l"	, "r=l");
	WinAPI.Register("USER32.DLL", "GetClipboardFormatName"	, "i=lpl", "r=l");

	WinAPI.OpenClipboard(0);

	НомБуфера= WinAPI.EnumClipboardFormats(0);
	СтрБуф   = WinAPI.Space(256);
	pStr     = WinAPI.StrPtr(СтрБуф);
	ФорматЕстьВБуфере=0;
	Пока НомБуфера<>0 Цикл
		НомБуфера=WinAPI.EnumClipboardFormats(НомБуфера);
		Рез = WinAPI.GetClipboardFormatName(НомБуфера,pStr,256);
		Если Рез=0 Тогда Продолжить; КонецЕсли;
		ИмяЧтоЕстьВБуфере=WinAPI.StrGet(pStr,"s");
		Если ВывестиИменаБуферов=1 Тогда
			Сообщить(ИмяЧтоЕстьВБуфере);
		Иначе
			Если ТипБуфера=ИмяЧтоЕстьВБуфере Тогда
				ФорматЕстьВБуфере=1;Прервать;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	Если ПустаяСтрока(ТипБуфера)=1 Тогда			  wFormat = 1;
	ИначеЕсли ТипЗначенияСтр(ТипБуфера)="Число" Тогда wFormat = ТипБуфера;
	Иначе											  wFormat = WinAPI.RegisterClipboardFormatA(ТипБуфера);
	КонецЕсли;
	Дескриптор  = WinAPI.GetClipboardData(wFormat);
	lSize 		= WinAPI.GlobalSize(Дескриптор);
	Если Дескриптор <> 0 Тогда
		Указатель = WinAPI.GlobalLock(Дескриптор);
		Результат = WinAPI.StrGet(Указатель,"s");
		WinAPI.GlobalUnlock(Дескриптор);
	Иначе
		Результат = "";
	КонецЕсли;
	WinAPI.CloseClipboard();
	Если ПерекодироватьвWin1251=1 Тогда
		BinData = СоздатьОбъект("BinaryData");
		BinData.Кодировка = 0;
		BinData.ЗаписатьСтроку(Результат,1);
		Результат = ""; Стр = "";
		BinData.Кодировка = 3;
		BinData.Перейти(0,0);
		Пока BinData.ПрочитатьСтроку(Стр,0) = 1 Цикл
			Результат=Результат+Стр+РазделительСтрок;
		КонецЦикла;
		BinData.Close();
	КонецЕсли;
	Возврат Результат;
КонецФункции
 

  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать