Использование ЗапуститьПриложение() без потери фокуса?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Не пробовал конечно, мысль такая чтобы после запуска программы отработать программное нажатие клавиш Alt+Tab.
так все такие, есть способ, хоть со скриптами?
wsh=Новый COMОбъект("WScript.Shell");
wsh.Run(Команда, 1, истина); //1 - видимо, истина - дожидаясь завершения
wsh.sendkeys("%{TAB}");
Все равно не помогает, не туда переключает
wsh=Новый COMОбъект("WScript.Shell");
wsh.Run(Команда, 1, истина); //1 - видимо, истина - дожидаясь завершения
wsh.sendkeys("%{TAB}");
Все равно не помогает, не туда переключает
без скриптов не знаю, со скриптами можно ЗапуститьПриложение() дождаться закрытия писать срипт по поиску открытого окна 1С например по заголовку и активизировать его. Делал такое ещё на 7.7.
А если воспользоваться
КомандаСистемы (System)
Синтаксис:
КомандаСистемы(<СтрокаКоманды>, <ТекущийКаталог>)
Параметры:
<СтрокаКоманды> (обязательный)
Тип: Строка. Команда системы.
<ТекущийКаталог> (необязательный)
Тип: Строка. Устанавливает текущий каталог на время выполнения команды.
Описание:
Вызывает на исполнение команду операционной системы, как если бы она была введена в командной строке.
Доступность:
Тонкий клиент, толстый клиент.
Примечание:
После загрузки Windows-приложения управление возвращается в 1С:Предприятие и исполнение модуля продолжается.
КомандаСистемы (System)
Синтаксис:
КомандаСистемы(<СтрокаКоманды>, <ТекущийКаталог>)
Параметры:
<СтрокаКоманды> (обязательный)
Тип: Строка. Команда системы.
<ТекущийКаталог> (необязательный)
Тип: Строка. Устанавливает текущий каталог на время выполнения команды.
Описание:
Вызывает на исполнение команду операционной системы, как если бы она была введена в командной строке.
Доступность:
Тонкий клиент, толстый клиент.
Примечание:
После загрузки Windows-приложения управление возвращается в 1С:Предприятие и исполнение модуля продолжается.
А, ладно, надо увеличить мотивацию, добавляю еще 40, итого 60. ;-) ибо важно.
Я и команду системы пробовал и через МССкрипт, не помогает.
И сендкейс пробовал - переключает, да не туда, куда надо.
Я и команду системы пробовал и через МССкрипт, не помогает.
И сендкейс пробовал - переключает, да не туда, куда надо.
//КомандаЗам = СтрЗаменить(Команда, """", """""");
//ScrptCtrl= Новый COMОбъект("MSScriptControl.ScriptControl");
//ScrptCtrl.Language="vbscript";
//ScrptCtrl.AddCode("
//|Sub My
//| Set MyShell = CreateObject(""WScript.Shell"")
//| MyShell.RUN """ + КомандаЗам + """, 1, true
//|End Sub");
//ScrptCtrl.Run("My");
//wsh=Новый COMОбъект("WScript.Shell");
//wsh.sendkeys("%{TAB}");
//wsh.Run(Команда, 1, истина); //1 - видимо, истина - дожидаясь завершения
//wsh.sendkeys("%+{TAB}");
//wsh.sendkeys("%+{TAB}%{TAB}%{TAB}");
//wsh.sendkeys("%+{TAB}%{TAB}%{TAB}");
Показать
Попробуйте метод Exec, пример:
мShell=Новый COMОбъект("WScript.Shell");
Процесс=мShell.Exec(ИмяИПутьКИсполняемуФайлу);
OutStream=Процесс.StdOut;
Пока НЕ OutStream.AtEndOfStream Цикл
Ответ=ОКР(Число(OutStream.ReadLine())/1000);
КонецЦикла;
мShell=Новый COMОбъект("WScript.Shell");
Процесс=мShell.Exec(ИмяИПутьКИсполняемуФайлу);
OutStream=Процесс.StdOut;
Пока НЕ OutStream.AtEndOfStream Цикл
Ответ=ОКР(Число(OutStream.ReadLine())/1000);
КонецЦикла;
(12) Всё это у меня работало, как однажды стало запускаться не из под меня, а из-под USR1CV8. Тема старая, но сломал башку, пока это обнаружил.
Решилось функцией "ЗапуститьПриложение()". Единственно что плохо - это не возвращает параметры процесса.
Приложил картинку с настройкой(см ниже)
Вот если там стоит рекомендованный USR1CV8, тогда Shell будет под ним.И доступа к ресурсам может не быть
Если от текущего, как на картинке, то значит будет от того, кто зашел на сервер. И доступы все реально проверяемые.
Решилось функцией "ЗапуститьПриложение()". Единственно что плохо - это не возвращает параметры процесса.
Приложил картинку с настройкой(см ниже)
Вот если там стоит рекомендованный USR1CV8, тогда Shell будет под ним.И доступа к ресурсам может не быть
WshShell = Новый COMОбъект("WScript.Shell");
Процесс = WshShell.Exec(СтрокаКоманды);
Если от текущего, как на картинке, то значит будет от того, кто зашел на сервер. И доступы все реально проверяемые.
Прикрепленные файлы:
Пока что решил проблему через подключение однократное обработчика ожидания из модуля приложения.
А в обработчике шлю клавиши ALT + TAB.
Работает, но как-то с задержкой. Хотя лучше, чем ничего.
А в обработчике шлю клавиши ALT + TAB.
Работает, но как-то с задержкой. Хотя лучше, чем ничего.
Друзья я не силён в скриптах и низкоуровневом программирование, но может кого то наведёт на мысль...
Перед запуском ЗапуститьПриложение(), получить дескриптор окна 1С, а после завершения вернуть ему фокус
Перед запуском ЗапуститьПриложение(), получить дескриптор окна 1С, а после завершения вернуть ему фокус
WSHShell = СоздатьОбъект("WScript.Shell");
l = СоздатьОбъект("wbemscripting.swbemlocator");
oExec = WshShell.Exec("rundll32 kernel32,SleepEx");
s = l.connectserver();
ProcessID = s.get("win32_process.Handle="+oExec.ProcessID).ParentProcessID;
скопипастил отсюда:
Т.е. ID процесса есть, теперь нужно вернуть ему фокус
Синтаксис:
AppActivate(<Title>)
Назначение: активизирует указанное окно какого-либо приложения. Возвращает True в случае успеха и False в случае неудачи.
Параметры:
<Title> - заголовок окна приложения или идентификатор процесса.
Осталось слепить это и попробовать)...
l = СоздатьОбъект("wbemscripting.swbemlocator");
oExec = WshShell.Exec("rundll32 kernel32,SleepEx");
s = l.connectserver();
ProcessID = s.get("win32_process.Handle="+oExec.ProcessID).ParentProcessID;
скопипастил отсюда:
Т.е. ID процесса есть, теперь нужно вернуть ему фокус
Синтаксис:
AppActivate(<Title>)
Назначение: активизирует указанное окно какого-либо приложения. Возвращает True в случае успеха и False в случае неудачи.
Параметры:
<Title> - заголовок окна приложения или идентификатор процесса.
Осталось слепить это и попробовать)...
(16) там нюанс в том, что пока ты в исполнении кода, фокус может и не вернуться, как-то так.
ведь если я ставлю сендкейс Алт+таб после вызова метода запуститьПриложение, то фокус возвращается в соседнее с 1с окно, т.к. наверное 1с еще в статусе занято, но попробовать можно, по идее.
ведь если я ставлю сендкейс Алт+таб после вызова метода запуститьПриложение, то фокус возвращается в соседнее с 1с окно, т.к. наверное 1с еще в статусе занято, но попробовать можно, по идее.
(17) Для 8.1 идея такая: Из формы открываем маленькое модальное окошечко - "ланчер" при открытии "ланчера" выполняем запуск приложения, потом возвращаем фокус - ЭтаФорма.Активизировать(); далее закрываем "ланчер" и возвращаем из "ланчера" управление в родительскую форму.
Если из формы запустили приложение, то может что-то такое попроовать:
В процедуре запуска приложения вызвать проверку
Процедура Проверка()
Если ВводДоступен() Тогда
Сообщить("Приложение активно");
Иначе
Форма.Активизировать();
КонецЕсли;
КонецПроцедуры;
ПоказатьВ процедуре запуска приложения вызвать проверку
Если КодВозврата<>Неопределено Тогда
Проверка();
КонецЕсли;
КонецЕсли;
как программист баз данных я должна сказать что эта событий не связана с 1с .Батник должен быть другой
Для тех , кто работал с большими локалками и временем, должен меня понять, что я не могу сделать деньги из плохо написанной модной системы , но мне тревожно , что еще скрипты выполняют :)
в свое время я выделяла 1с компьютер и ночью решала все проблемы. Это кризис для денежных вариантов схем бизнеса - нет компьютеров больше на складе. я не работаю в больших сетях. я только учусь учить.
Эй мальчики ! где премия ? :) я решила !
ЗапуститьПриложение("C:\3.bat",,ложь);
ЭтаФорма.Активизировать();
ЗапуститьПриложение("C:\3.bat",,ложь);
ЭтаФорма.Активизировать();
Хреново ты решила. Активизировать форму не обязательно и можно дожидаться завершения приложения. Нужно в bat файле ключ /b ставить, тогда фокус теряться не будет
я фигею с людей, которые пишут в темах двухлетней давности, где эти темы только находят. natarezn так вообще 7 сообщений, явно пытается startmoney накрутить.
Воскрешу как тему.
Обычные формы.
Но способ пашет пока окно 1С не ушло с экрана, например еще куда-то переключились.
Что под управляемыми формами происходит мне не актуально в данном случае.
Обычные формы.
Асинх Процедура КнопкаВыполнитьНажатие(Кнопка)
КодВозврат = Ждать ЗапуститьПриложениеАсинх("cmd.exe",, Истина);
Сообщить(КодВозврат);
КонецПроцедурыНо способ пашет пока окно 1С не ушло с экрана, например еще куда-то переключились.
Что под управляемыми формами происходит мне не актуально в данном случае.
Вот так фокус не уходит и черное окно не появляется.
Оболочка = Новый COMОбъект("Wscript.Shell");
КодВозврата = Оболочка.Run(СтрокаЗапускаКонвертера, 0, истина);
Оболочка = Неопределено;
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот
