Внешняя компонента симуляции нажатий клавиатуры и мыши (в т.ч. сворачивание/разворачивание динамических списков)
В свое время очень мучал вопрос сворачивания/разворачивания динамических списков. Ситуацию обостряло тысяча подобных вопросов в гугле и не одного толкового ответа (по крайней мере я не видел).
Проблема тогда была решена здоровенным костылем: запуском скомпилированного скрипта AHK на сочетание Ctrl+Shift+Num-/Num+
Душа терзалась столь неизящным решением и вот наконец дошли руки сделать это чуть лучше и вдобавок слегка расширить функционал 1с.
Функционал:
Не буду долго тянуть, вк использует функцию Win Api - SendInput() для симуляции нажатий клавиш клавиатуры/мыши по виртуальным кодам.
Также в вк для удобства добавлена функция паузы и свойство определяющее продолжительность зажатия клавиши.
Для удобства в 1с создана обертка над вк, позволяющая использовать её весьма интуитивно, понятно и максимально просто.
Можно вызывать нажатие клавиши по её имени. Тестировал на Win Server 2012 R2 с Qwerty клавиатурой на 1с 8.3.10.2561.
Примеры использования:
Передаваемые в функции параметры довольно подробно описаны в общем модуле в сопровождении к функциям. Конфигуратор подскажет, что писать.
Клавиатура.Пауза()
Клавиатура.Свернуть()
Клавиатура.Развернуть()
Клавиатура.ВыполнитьНажатие()
Листинг основного функционала общего модуля:
Листинг вспомогательного функционала общего модуля:
Послесловие:
Во вложении будет архив, в нем: тестовая конфигурация с примерами использования, утилитой для определения кодов клавиш, текстовый файл с ссылкой на вирустотал, xls документ с используемыми соответсвиями названиями и кодами клавиш, листинг общего модуля и собственно сама подключаемая библиотека. Надеюсь хоть комуто смог помочь, также прошу прощения за очепятки и абшибки. Повторюсь, компонента только для OS Windows начиная с 2000 , тоесть, по сути, должна работать только на любой современной Windows оси, в процессе использования она сама откидывает линь, мак, мобильное приложение и браузер, функции возвращают Ложь, вместо Истина. Возможно будет работать через Wine, такого Я не пробывал, не знаю.
ЕСЛИ У ВАС ВОЗНИКЛИ ВОПРОСЫ, С УДОВОЛЬСТВИЕМ ОТВЕЧУ В КОММЕНТАРИЯХ ИЛИ ЛС
UPD 17.10.19
Как мне подсказал в комментариях Сергей Лесовой, для сворачивания/разворачивания дин. списка можно применить более изящное решение:
Правда такой подход не работает с иерархическим дин. списком, в то время как компонента отрабатывает нормально.
Компонента, Я полагаю, имеет право продолжать жить для других задач по автоматизации.
Скачать файлы Специальные предложения(10) Протестировал, спасибо, действительно такой код будет много изящнее:
Сейчас добавлю в темку.
- Скопировать ссылку
- Перейти
WshShellW = Новый COMОбъект("WScript.Shell"); WshShellW.AppActivate(ПолучитьЗаголовокСистемы());
// Команда может состоять из одной буквы ПозицияОткрывающейСкобки = Найти(ПередаваемыеДанные.СочетаниеКлавиш, " "); Если ПозицияОткрывающейСкобки <> 0 Тогда Если ПозицияЗакрывающейСкобки - ПозицияОткрывающейСкобки - 1 = 1 Тогда Буква = Сред(ПередаваемыеДанные.СочетаниеКлавиш, ПозицияОткрывающейСкобки + 1, 1); Буква = ИСТП_ПреобразоватьБуквуВСоответствииСРаскладкой(Буква); Команда = Сред(ПередаваемыеДанные.СочетаниеКлавиш, 1,ПозицияОткрывающейСкобки) + Буква + Сред(ПередаваемыеДанные.СочетаниеКлавиш, ПозицияЗакрывающейСкобки); Иначе Команда =ПередаваемыеДанные.СочетаниеКлавиш; КонецЕсли; Иначе // скобок может и не быть Команда = ПередаваемыеДанные.СочетаниеКлавиш; ЕстьКТРЛ = Ложь; ЕстьАЛЬТ = Ложь; ЕстьШИФТ = Ложь; Если Найти(Команда, "^") > 0 Тогда Команда = СтрЗаменить(Команда, "^", ""); ЕстьКТРЛ = Истина; КонецЕсли; Если Найти(Команда, "%") > 0 Тогда Команда = СтрЗаменить(Команда, "%", ""); ЕстьАЛЬТ = Истина; КонецЕсли; Если Найти(Команда, "+") > 0 Тогда Команда = СтрЗаменить(Команда, "+", ""); ЕстьШИФТ = Истина; КонецЕсли;
Если СтрДлина(Команда) = 1 Тогда Команда = ИСТП_ПреобразоватьБуквуВСоответствииСРаскладкой(Команда);
Если ЕстьШИФТ Тогда Команда = "+" + Команда; КонецЕсли;
Если ЕстьАЛЬТ Тогда Команда = "%" + Команда; КонецЕсли;
Если ЕстьКТРЛ Тогда Команда = "^" + Команда; КонецЕсли; Иначе Команда = ПередаваемыеДанные.СочетаниеКлавиш; КонецЕсли; КонецЕсли;