:: Visual Foxpro, Foxpro for DOS
Re: FPD 2.6 и буфер обмена Windows
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Напиши сам, там кода на 20 строк на сях - по сути нужен пяток АПИ функций. Только прежде всего надо ПОНЯТЬ что такое буфер обмена винды, какие там есть "форматы", как он хранит в себе тексты (а он их хранит по разному!), и в частности почему из того-же VFP если копировать кириллицу, то иногда (при активной английской раскладке) в буфере оказываются "иероглифы"...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Simple777
Да, утилитка занятная.
Действительно, припомнил сейчас эту утилитку (nircmd, года 3 назад последний раз с ней возился), одновременно и ужасающую и восхищающую своими поистине гигантскими практически недостижимыми ни для одной крупной современной софтверной фирмы/корпорации возможностями в столь малом объеме килобайт. Это без преувеличения шедевр программистской мысли, иначе не скажешь. И большинству разработчиков современного крупногабаритного софта глядя на нее стоит, если не повеситься, то хотя бы искусать собственные локти до уровня 4-х маслов, которые постоянно рекламируют по ТВ.

Simple777
Причем кодовую страницу 866 нельзя занести корректно в буфер обмена никаким способом, а вот при копировании текста в кодовой таблице 1251 можно в буфере обмена выбрать "Вид" - "Текст", и тогда скопированный текст отображается корректно.
Почему же только 1251? 866 точно так же вставляется и исправляется в менюшке буфера обмена. Хотя в данном случае это само собой и не выход.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)




Исправлено 1 раз(а). Последнее : Crispy, 12.02.13 13:38
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Simple777
Причем кодовую страницу 866 нельзя занести корректно в буфер обмена никаким способом

"Слушай, Валико-джан. Я тибе адин умный вещь скажу. Только ты не обижайся."
Вставляю я строку, скопированную в буфер из-под FPD - в окошко VFP. И чтобы выдумали? Отображается нормально.
Тут-то не вытерпел я и уже чисто из любопытства, вставив это дело в офис, через просмотр в окошке формата шрифта быстренько пробежался по шрифтам. И о чудо (в смысле, то, о чем и подумал с самого начала) - для шрифтов "старой закалки" (win98) FPD-шная строка отбразилась как ей и положено.
Т.е., то, что я и подозревал - дело в доюникодовском "смещении" букв в кодовых страницах файлов шрифтов. Которое например хорошо можно наблюдать в любом редакторе шрифтов. Почему оно так сделано в утилите это как бы уже другой вопрос (скорее к разработчикам nircmd). Тем не менее при установленных по умолчанию шрифтах-98 (если у тебя таковые наблюдаются), например Peterburg (неплохой таймсовский вариант кстати по начертанию, даже красивее) и ряда других (они в основном с красивым начертанием букв, курсивные) отображение строки вполне нормально.
Хотя в общем случае это тоже не выход вероятно. Впрочем лечить это путем замены в реестре 1252 -> 1251 на мой взгляд вариант еще менее пригодный.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Шрифты тут совершенно не при чём. Просто есть в виндовом "буфере обмена" 3 БАЗОВЫХ формата для хранения и ИЗВЛЕЧЕНИЯ "чисто-текстовых" данных (про всякие HTML да RTF пока забудем) CF_OEMTEXT, CF_TEXT и CF_UNICODETEXT (надеюсь названия форматов вполне "говорящие" и расшифровывать их не нужно). И есть система "синтезирования" недостающих форматов. Т.е. если, например, одна прога поместила в буфер данные в формате CF_UNICODETEXT, то другая вполне может "извлечь" данные в формате CF_TEXT или CF_OEMTEXT ну и наоборот тоже... И вот как раз в этой самой процедуре "синтезирования того чего нету" и кроется проблема "русских буковок" - винда в качестве "недостающего параметра преобразования" для конвертации анси/оем текста в юникод (т.к. такое преобразование требует указания кодовой страницы анси/оем текста) использует хранящийся в том же самом буфере обмена идентификатор языка (специальный формат CF_LOCALE) - а уж он, если его явно не прописала программа поместившая текст в буфер (очевидно что большинство программ этого НЕ делают), будет взят из текущего языка ввода для того окошка из которого происходило копирование.
Впрочем, всё это подробнейшим образом расписано и в MSDN и во всяких программистских форумах - как ПРАВИЛЬНО помещать в буфер обмена русский текст (конечно, если его пихать в юникоде то проблем/неоднозначностей не будет вовсе).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
vk65

Сообщений: 402
Дата регистрации: 08.04.2008
korsak
в win7 работает - clip.exe. Унес его в XP, при запуске ошибка - "это не приложение win32"
В winXP будет работать clip из win2003server, можно взять здесь:
pubs.logicalexpressions.com
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Действительно, clip.ex из сообщения vk65 корректно работает в WinXP и для 866, и для 1251

Что же касается утилиты nircmd, то для нее вполне возможно преобразовать таблицы 866 или 1251 в Unicode. Наверняка есть пакетные утилиты. И если Unicode всегда будет отображаться в буфере корректно, то вроде как и проблемы не должно быть.

Но вот я попробовал занести в буфер обмена данные из файла в формате Unicode

nircmd.exe clipboard readfile myfile.txt

И по этой команде в буфер обмена вместо текста занеслось только 2 ера, т.е. 2 твердых знака.

А вот вышеупомянутая утилита clip.exe текст в формате Unicode помещает в буфер обмена корректно.

И опять таки остается открытым вопрос о считывании данных из буфера обмена в среду FPD.



Исправлено 2 раз(а). Последнее : Simple777, 13.02.13 22:16
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Simple777
Но вот я попробовал занести в буфер обмена данные из файла в формате Unicode
nircmd.exe clipboard readfile myfile.txt

"Говорю же тебе - дерево там ВО! И мужик в пиджаке."
Я с файлом правда не пробовал, зато вот так пересылал строку из FPD:
a="йцукенгшщзхъфывапролджэячсмитьбю"
!nircmd.exe clipboard set &a
Однако насчет юникода тут бесполезно мне кажется. Поскольку с самого начала пробовал пропускать текст через самописный юникод-преобразователь из оема. В итоге вообще попадает в буфер какая-то еще большая крякозябрина. Т.е. в чем тут Игорь прав - что при занесении должен быть какой-то параметр с указанием на вид текста. И хотя я выше и выразился возможно несколько аляповато, но по сути все равно верно. Т.к. по-видимому при занесении из nircmd, в качестве параметра указана 1252 страница. Т.е. когда заносишь непосредственно текст оем, то на наметанный (уже ) взгляд, визуально туда садятся именно буквы 1252 кодовой страницы. В принципе правкой реестра это дело конечно исправляется. Но такое не есть гуд разумеется.
А вот clip.exe, которым выше поделился vk65 - вещь уже реальная, где все сделано как надо. Жаль только, что работает лишь с файлами, а не со строками в том числе, как это например может делать великий nircmd.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Утилиты, утилиты - несколько строк на си вот и все утилиты... Если не затачивать исходник под оба варианта компиляции - ANSI и UNICODE то и того меньше будет...
#include "stdafx.h"
#include <Windows.h>
void SetClipboard(_TCHAR *);
int _tmain(int argc, _TCHAR* argv[])
{
if (argc = 2)
{
SetClipboard(argv[1]);
}
return 0;
}
void SetClipboard(_TCHAR *output)
{
const size_t len = (_tcslen(output) + 1) * sizeof(_TCHAR);
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
memcpy(GlobalLock(hMem), output, len);
GlobalUnlock(hMem);
OpenClipboard(0);
EmptyClipboard();
#ifdef _UNICODE
SetClipboardData(CF_UNICODETEXT, hMem);
#else
SetClipboardData(CF_TEXT, hMem);
HGLOBAL hMem2 = GlobalAlloc(GMEM_MOVEABLE, sizeof(LCID));
LCID *pNewLCID = (LCID *) GlobalLock(hMem2);
*pNewLCID = MAKELCID(MAKELANGID(LANG_RUSSIAN, SUBLANG_NEUTRAL), SORT_DEFAULT);
GlobalUnlock (hMem2);
SetClipboardData(CF_LOCALE, hMem2);
#endif
CloseClipboard();
}


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Я так понимаю, это исходник на сях (каких, интересно - их же вроде много разных, этих сей)

Наверное, для большинства участников форума этот исходник легко читаем и легко компилируем. Также для них очевидны параметры запуска для откомпилированного исходника. А вот про себя такого сказать не могу.
Фигурные скобки помню... "Казань брал,Астрахань... брал... Ревель брал... Шпака не брал..."

И насчет nircmd Если он заточен под таблицу 1252, так ведь можно, видимо, перед отправкой в буфер в тексте сделать преобразование в кодовую таблицу 1252. И тогда можно будет передавать тексты в буфер обмена без каких-либо заморочек.
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Simple777
Я так понимаю, это исходник на сях (каких, интересно - их же вроде много разных, этих сей)
Тестил на VS 2008 - минимальный сишный проект "без всего". Большая часть сего "исходника" находится в гугле за пару минут.
Simple777
Также для них очевидны параметры запуска для откомпилированного исходника.
просто
имя_exe "строка которую надо положить в буфер обмена"
- кавычки нужны чтобы пробелы передать.
Simple777
И насчет nircmd
Исходников оного нет, и что там и как сделали разрабы неизвестно (не, ну коенчно не составляет труда запустить под win32 отладчиком и посмотреть чего он вызывает). Скорее всего они ПРОСТО не заморачивались на установку CF_LOCALE - в моём примере видно, что если прога скомпилирована в unicode версии, то она просто получает параметр командной строки в юникоде и помещает его в буфер обмена БЕЗ всяких неоднозначностей. Если же скомпилировать в ANSI версии, то без дополнительного кода система автоматом поместит в качестве CF_LOCALE тот идентификатор языка, который был активен в момент "копирования" - я понятия не имею какой язык активен для твоей досовской консоли-эмулятора, но раз выходят "иероглифы" - то вероятно не русский. Я же принудительно говорю что там русские буковки - это позволяет не заморачиваться на "текущий язык ввода".
Вообще я не запускал эту мега-утилиту из под ntvdm - т.е. из FPD и ему подобных старичков, бог его знает как они взаимодействуют с обычными win32 программами... Не актуально это...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Simple777
так ведь можно, видимо, перед отправкой в буфер в тексте сделать преобразование в кодовую таблицу 1252

Цитата:
"Айте купадон! Мизен так-нот пинто! Бастуджо нек-нем труляля!Нет чачача, трукаделло вит!" (Дальше следует непереводимая игра слов с использованием местных идиоматических выражений.)

Т.е. стандартными средствами это непереводимо. Для таких целей обычно использовали патчи - фонтов, файлов раскладок и прочего. Если на пальцах - тут ведь речь идет о том, чтобы скажем из интервала CHR(1)-CHR(255) (ведь их всего 255!) возвращались совсем другие символы, чем они возвращаются системой для данной утилиты. Да и кроме 1252=1251 надо возможно еще и 437=866 делать. Так что "будете у нас на Колыме — милости просим!" Поэтому мне кажется уж лучше вы к нам - сделать свою утилитку по совету Игоря.
Короче: www.youtube.com


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
korsak

Сообщений: 269
Откуда: Киров (Вятка)
Дата регистрации: 27.03.2007
Igor Korolyov
Simple777
Я так понимаю, это исходник на сях (каких, интересно - их же вроде много разных, этих сей)
Тестил на VS 2008 - минимальный сишный проект "без всего". Большая часть сего "исходника" находится в гугле за пару минут.
а слабо было просто компильнуть и страждущему отдать, который Шпака не брал?



Исправлено 1 раз(а). Последнее : korsak, 15.02.13 11:05
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
У меня нету под рукой нормального сишного компилятора, который бы без лишних усилий сделал "минимальный самодостаточный exe". А создаваемый студией exe, которому нужен msvcr90.dll и ещё бог знает что, выкладывать смысла не вижу ни малейшего.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Ну, ежели подвести некоторые промежуточные итоги обсуждения.

Поместить в буфер клавиатуры текст можно для XP утилитой clip.exe, предложенной vk65
Для Vista, Win7 и Win8 можно использовать системную одноименную утилиту clip.exe

А для считывания данных из буфера обмена в FPD можно сохранить содержимое буфера обмена в файл:

nircmd.exe clipboard addfile "c:\My Files\info1.txt"

Вроде бы текст всегда сохраняется в кодовой странице 1251, что легко преобразовывается в кодовую страницу 866.

В принципе, это решение проблемы, причем эти варианты будут работать, начиная с XP и выше (для помещения данных в буфер обмена), и начиная с Win98 и выше для считывания данных из буфера обмена, чего вполне достаточно.

Если б "допилить" утилитку на сях, то тогда было бы вообще универсальное решение для всех ОС Win, начиная с 98.

Но насколько я понимаю, эта утилитка передает строку в буфер обмена, а не файл. Или можно передать через переменную содержимое файла? И будут ли ограничения в этом случае на длину передаваемой через переменную строки?



Исправлено 2 раз(а). Последнее : Simple777, 15.02.13 23:14
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Написать можно всё что надо. Хоть через файл хоть через параметр командной строки. Для работы утилиты под Win9x скорее всего новая Visual Studio не подойдёт - надо искать антикварные компиляторы... Кроме того в мастдае буфер обмена работает не совсем так, насколько я помню...
Но уж извини делать это будет, очевидно, тот кому нужно антиквариат поддерживать - я пас.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Несколько некропостинг, но обсуждение поднятой темы по сути зашло в свое время некоторый тупик.

Но вот нынче опять появился вопрос об обмене данными в буфером Windows из-под FPD.
Стал искать на форуме по nircmd

Поиск дал неожиданный результат.

forum.foxclub.ru

Оказывается, еще за 7 лет до моего вопроса это обсуждалось. И есть отличная утилита WINCLIP, которая из-под FPD 2.6 может и текст помещать в буфер Windows, и считывать данные из оного буфера в файл. И вроде как даже с unicode работает.

Такие дела. [sm128]

FPD 2.6 Forewer! :bodr:
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Симпле, ты умрешь, и скажешь начертать на камне - "FPD" )
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
[sm021] :danc: [sm128]
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
Simple777
есть отличная утилита WINCLIP, которая из-под FPD 2.6
С каких пор дос-программы стали запускать что-то "из-под" себя? С каких пор свойства виндовой консольной утилиты стали достоинствами ничего не знающей ничего про всё это дос-прогрммы?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: FPD 2.6 и буфер обмена Windows
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
ну, в винде10 якобы сделали перенос Ctrl-C из черного окна в винду и обратно.. наврали)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 16 (Гостей: 16)

© 2000-2024 Fox Club 
Яндекс.Метрика