Менеджер буфера обмена. Нативная внешняя компонента win 32/64




Добавляет возможности получения информации из почтовых вложений или файлов с других рабочих столов (RDP) с помощью операций копирования/вставки.
Может «прослушивать»: любые изменения буфера обмена; нажатие клавиш соответствующих вставке (paste); нажатие клавиш копирования (copy); drop операции.
Это новая реализация аналогичной компоненты https://infostart.ru/public/379695/, но теперь не C#, а С++ нативно для x32 / x64.
(см. http://youtu.be/-PaWWFfbYo4)

Описание компоненты «Менеджер буфера обмена».

Основное назначение – добавить для приложения 1С возможность получения информации из почтовых вложений или файлов с других рабочих столов (RDP) с помощью операций копирования/вставки.

Помимо этого, компонента может «прослушивать»:

  • любые изменения буфера обмена;
  • нажатие клавиш соответствующих вставке (paste) из буфера обмена;
  • нажатие клавиш копирования (copy);
  • drop операции.

Параметры компоненты:

  • Только для Windows (32 и 64);
  • Нативная (C++). Не требует регистрации в реестре;
  • Исполняемые файлы BwwLib32.dll и BwwLib64.dll;
  • Подключение "AddIn.BwwLib.ClipboardManager";
  • Протестировано на ОS Win 10 и Win 2012 сервер. Платформы 1С 8.3.10 и 8.3.14;

Подробное описание методов и событий компоненты дано в файле «Форматы, методы и события компоненты.xlsх”

Использование методов компоненты продемонстрировано в расширении «МенеджерБуфераОбмена.cfe»

В расширении всего одна одноименная обработка. Упаковка ее в расширение сделана только для того, что бы  максимально сохранить исходный вид. Если внедрять ее (обработку)  в другие конфигурации напрямую (без расширения), то «слетают» картинки.

DLL файлы компоненты сохранены в  общих макетах расширения «BwwLib32» и «BwwLib64» и в макетах обработки.

Работа с компонентой реализована полностью асинхронно.

Порядок подключения расширения к Вашей конфигурации см. ниже.

Недостатки компоненты.

При разработке компоненты, помимо работы с буфером обмена, была предпринята попытка расширить возможности 1С по использованию drag-drop операций (например, получить почтовые вложения перетаскиванием).

В качестве слушателя drop операций был использован класс IDropTarget, с помощью которого замечательно выполняется перехват, НО!!!

  • при подключении слушателя компоненты к активному окну 1С отключается штатный drop слушатель приложения;
  • он не восстанавливается после отключения ВК или закрытия/открытия окна формы обработки. Для восстановления требуется перезапуск приложения 1С!

Основная причина – «прослушка» устанавливается на главное окно приложения! Если бы «прослушка» включалась для конкретного поля/control-а формы, то все было бы Ок. Но в «тонком» клиенте их вообще «не видно» (в «толстом» определить control-ы возможно, хотя и проблематично). Т.е. имеем основное окно приложения 1С (типа фрейма), а в нем HTML control-ы, которые уже не win-окна, а что-то типа WebView класса. Может быть кто-то уже занимался этим? Было бы интересно…

Таким образом, использование возможности ВК по прослушиванию drop операций не рекомендуются!

Порядок подключения расширения к конфигурации на примере ERP 2.0

1. Создаем в конфигурации ERP новое расширение. Рисунок № 1.

2. Загружаем в расширение файл “Менеджер буфера обмена.cfe”. Рисунок № 2.

3. Синхронизируем роли и совместимость расширения и конфигурации. Рисунок № 3.

4. Добавили в расширение основную роль конфигурации. Рисунок № 4. Если расширение встраивается в чистую конфигурацию, то этот пункт можно пропустить

15 Comments

  1. oleg_km

    >> в «толстом» определить control-ы возможно, хотя и проблематично

    Это в какой версии платформы? На платформе 8.3.14 контролы в обычных окнах тоже не виндовые.

    Reply
  2. Bww

    Имел в виду 8.3.10.

    С какой конкретно версии прошли изменения — не знаю.

    Reply
  3. docerman

    Добрый день.

    Не понял по методам.

    Копирую файл на RDP. Вижу что он отображается в галерее файлов и изображений.

    Как мне получить сам файл в 1С? Можно ли его скопировать во временную папку?.

    Reply
  4. Bww

    Конечно можно

    Reply
  5. Bww

    Весь код сосредоточен в обработке расширения «Bww_МенеджерБуфераОбмена»

    Код несколько «запудренный», т.к. используются асинхронные методы вызова, где каждый метод (действие) разбит на два этапа – начало и завершение (смотри процедуры «ВызовМетодаКомпоненты_Начало» и «ВызовМетодаКомпоненты_Завершение». Именно в них отрабатываются все методы) Если не используешь УФ (ассинхронность), то все очень упрощается.

    Тем не менее, предположим что УФ и ты используешь следующий сценарий:

    • Запустил 1С на RDP машине.

    • Включил обработку, выполнил подключение к компоненте и включил «ухо»

    o В этот момент сработал метод включения прослушивателя буфера обмена «ListenerOn«. См. вышеописанные процедуры.

    o Т.е. теперь Dll-ка смотрит за изменением буфера обмена;

    • Когда ты скопировал файл(ы) на локальной машине

    o Dll-ка сообщила о изменении в буфере обмена через процедуру «ВнешнееСобытие» Событие = «CHANGE CLIPBOARD». После чего включился метод определения содержимого буфера «DefineContentFormats«;

    o В этом методе Dll-ка просматривает в буфере наличие форматов

    Если Результат = «TEXT» Тогда

    ВызовМетодаКомпоненты_Начало(«GetText»);

    ИначеЕсли Результат = «TEXT|BITMAP» Тогда

    ВызовМетодаКомпоненты_Начало(«GetText»);

    ВызовМетодаКомпоненты_Начало(«GetPictureFile»);

    ИначеЕсли Результат = «BITMAP» Тогда

    ВызовМетодаКомпоненты_Начало(«GetPictureFile»);

    ИначеЕсли Результат = «DROPFILES» ИЛИ

    Результат = «CONTENTFILES» Тогда

    ВызовМетодаКомпоненты_Начало(«GetFilesCount»);

    КонецЕсли;

    В твоем случае будет формат = «CONTENTFILES» и обработка вызовет метод «GetFilesCount«, а затем «GetFileInformation«, в которых будет заполнена таблица с инфой об файлах

    В случае CONTENTFILES файлов их полное имя (путь к ним) не известны, т.к. это не локальный DROP, а перекидывание буфера на RDP машину.

    Чтобы получить путь к файлу нужно вызвать метод «GetFilePath«, который принудительно запишет файл в temp папку пользователя на RDP машине и вернет путь к нему (полное имя файла).

    Т.е. передаем в метод GetFilePath краткое имя файла, , а получаем полное.

    Reply
  6. AneJIbcuH

    А в веб-клиенте будет работать?

    Reply
  7. docerman

    (5)

    Спасибо. Буду пробовать.

    А если не используются УФ какой алгоритм?

    Reply
  8. Bww

    «…если не используются УФ какой алгоритм?»

    Алгоритм тот же, но без разделения на процедуры «ВызовМетодаКомпоненты_Начало» и «ВызовМетодаКомпоненты_Завершение»,

    т.е. в одной процедуре можно сразу вызвать все методы

    DefineContentFormats;

    GetFilesCount

    GetFileInformation

    Reply
  9. Bww

    «…в веб-клиенте будет работать?»

    Попробую и отпишусь

    Reply
  10. docerman

    Добрый день.

    При запуске 1С на локальной машине все нормально.

    Но если я запускаю 1с через RDP, то при вызове метода GetFilePath возвращает неопределено.

    Компонента при этом подключается и методы GetFilesCount и GetFileInformation отрабатывают корректно.

    В чем может быть причина?

    Reply
  11. docerman

    (10)

    Заработало и через RDP.

    Reply
  12. docerman

    Прекрасная компонента, очень экономит время при подключении файлов к 1с.

    Reply
  13. Bww

    ОК!

    А то я уже сделал проверочную обработку для обычных форм

    В ней все предельно просто и понятно. См. основную процедуру «ОбновитьТаблицуФайлов»

    У меня все работает

    Reply
  14. Bww

    (6) Текущая версия точно нет!

    Создавать новую, с возможностью WEB подключения, пока не предусматривается

    Reply
  15. AneJIbcuH

    (14) Эх, жаль.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *