Имя: Пароль:
1C
1С v8
УФ - как получить фокус, чтобы работали горячие клавиши?
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) Черт возьми, ты был прав. Сработало. Спасибо!
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн