|
УФ - как получить фокус, чтобы работали горячие клавиши? | ☑ | ||
---|---|---|---|---|
0
СЕсин
26.07.16
✎
13:38
|
Всем доброго дня. Есть форма на которой 10 кнопок. В свойствах каждой кнопки (команды) установлено сочетание клавиш (горячая клавиша). Каждая из этих кнопок запускает такой или подобный код:
WshShell = Новый COMОбъект("WScript.Shell"); WshShell.Run("TASKKILL mpc-hc", 1, Истина); WshShell.Run(СтрокаЗапуска, 1, Истина); Все работает хорошо, но! При запуске скрипта открывается какое-то внешнее приложение, фокус с формы теряется и горячие клавиши не срабатывают, пока не тыкнешь мышкой на форму. Это честно говоря, перечеркивает всю идею - запускать эти небольшие скрипты одним нажатием кнопки. Я пробовал возвращать фокус довольно изощренным способом, а именно: WshShell = Новый COMОбъект("WScript.Shell"); l=Новый COMОбъект("wbemscripting.swbemlocator"); oExec=WshShell.Exec("rundll32 kernel32,SleepEx"); s=l.connectserver(); ProcessID=s.get("win32_process.Handle="+Формат(oExec.ProcessID,"ЧГ=0")).ParentProcessID; wshShell.appActivate(ProcessID); И ЭтаФорма.Активизировать() - пробовал ЭтаФорма.ТекущийЭлемент = Элементы.Кнопка1; - тоже пробовал. Все безуспешно. Форма действительно внешне становится активна, но горячие клавиши не срабатывают пока не щелкнешь мышкой. Подскажите пожалуйста, можно ли как-нибудь альтернативным способом перехватывать нажатия клавиш, чтобы не завязываться на активность формы? |
|||
1
СЕсин
26.07.16
✎
13:57
|
Вторая попытка.
|
|||
2
oslokot
26.07.16
✎
13:59
|
можно через ЗапуститьПриложение() и дождаться завершения
|
|||
3
Cyberhawk
26.07.16
✎
14:15
|
Запускай фоновое задание или невидимый клиентский сеанс, и в нем уже выполняй свои "скрипты"
|
|||
4
СЕсин
26.07.16
✎
14:31
|
(2) Проверил, через "Запустить приложение", к сожалению, тот же эффект. Фокус теряется.
(3) Возможно, я не совсем понял твою мысль. Мои "скрипты" запускают окна других приложений. Разве при запуске из фонового задания не будет происходить такая же точно потеря фокуса? |
|||
5
DrZombi
гуру
26.07.16
✎
14:34
|
(0) Можно вызвать код кнопок напрямую :)
|
|||
6
СЕсин
26.07.16
✎
14:39
|
(5) в смысле "код кнопок напрямую"? А я как код кнопок вызываю? )
|
|||
7
rrunover
26.07.16
✎
14:43
|
(6)
Процедура КнопкаНажатие(Элемент) СделатьКруто(); КонецПроцедуры Вызывай сразу "СделатьКруто()". |
|||
8
СЕсин
26.07.16
✎
14:49
|
(7) Нет, так то же самое.
|
|||
9
oslokot
26.07.16
✎
14:55
|
(8) а так?
ЗапуститьПриложение("cmd",,Истина); ЭтаФорма.Активизировать(); |
|||
10
СЕсин
26.07.16
✎
15:01
|
(9) ЭтаФорма.Активизировать(); - это первое о чем я подумал. Но после завершения внешнего приложения, окно 1С начинает мигать, типа оно активно, но фактически активным не становится.
|
|||
11
Cyberhawk
26.07.16
✎
15:11
|
(4) Попробуй уже
МенеджерФоновыхЗаданий.Выполнить (BackgroundJobsManager.Execute) МенеджерФоновыхЗаданий (BackgroundJobsManager) Выполнить (Execute) Синтаксис: Выполнить(<ИмяМетода>, <Параметры>, <Ключ>, <Наименование>) Параметры: <ИмяМетода> (обязательный) Тип: Строка. Имя экспортируемой процедуры или функции неглобального общего модуля, который может быть выполнен на сервере, в форме ИмяМодуля.ИмяМетода. <Параметры> (необязательный) Тип: Массив. Массив параметров, передаваемых в метод. Количество и типы параметров должны соответствовать параметрам метода. <Ключ> (необязательный) Тип: Строка. Ключ задания. Если ключ задан, то он должен быть уникальным среди ключей активных фоновых заданий, имеющих такое же имя метода, что и у данного фонового задания. <Наименование> (необязательный) Тип: Строка. Описание задания. Возвращаемое значение: Тип: ФоновоеЗадание. Описание: Инициирует выполнение фонового задания. Задание выполняется от лица текущего пользователя. Выполнение происходит без ожидания завершения задания. Если задан ключ задания, он должен быть уникальным среди ключей активных заданий. Доступность: Сервер, толстый клиент, внешнее соединение. |
|||
12
СЕсин
26.07.16
✎
15:27
|
(11) Черт возьми, ты был прав. Сработало. Спасибо!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |