Использование ЗапуститьПриложение() без потери фокуса?

1. nick_e 2 09.06.12 05:44 Сейчас в теме
Выполняю ЗапуститьПриложение() с параметром ожидания завершение приложения, ну фокус улетает конечно.. :(
Можно как то избежать потери фокуса без использования скриптов?
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nick_e 2 09.06.12 06:11 Сейчас в теме
НУ или программно вернуть фокус в 1С Предприятие, опять таки без использования скриптов?
3. Dima_b 09.06.12 08:33 Сейчас в теме
Не пробовал конечно, мысль такая чтобы после запуска программы отработать программное нажатие клавиш Alt+Tab.
4. nick_e 2 09.06.12 09:10 Сейчас в теме
Не,э то не вариант. :)

А как с окнами клиентского приложения работать?
5. nick_e 2 15.06.12 10:03 Сейчас в теме
Есть предложения?
6. fixin 4325 20.12.12 13:31 Сейчас в теме
так все такие, есть способ, хоть со скриптами?


wsh=Новый COMОбъект("WScript.Shell");
wsh.Run(Команда, 1, истина); //1 - видимо, истина - дожидаясь завершения
wsh.sendkeys("%{TAB}");


Все равно не помогает, не туда переключает
7. dour-dead 271 20.12.12 14:01 Сейчас в теме
без скриптов не знаю, со скриптами можно ЗапуститьПриложение() дождаться закрытия писать срипт по поиску открытого окна 1С например по заголовку и активизировать его. Делал такое ещё на 7.7.
8. AnderWonder 27 20.12.12 14:13 Сейчас в теме
А если воспользоваться
КомандаСистемы (System)
Синтаксис:
КомандаСистемы(<СтрокаКоманды>, <ТекущийКаталог>)
Параметры:
<СтрокаКоманды> (обязательный)
Тип: Строка. Команда системы.
<ТекущийКаталог> (необязательный)
Тип: Строка. Устанавливает текущий каталог на время выполнения команды.
Описание:
Вызывает на исполнение команду операционной системы, как если бы она была введена в командной строке.
Доступность:
Тонкий клиент, толстый клиент.
Примечание:
После загрузки Windows-приложения управление возвращается в 1С:Предприятие и исполнение модуля продолжается.
9. fixin 4325 20.12.12 14:25 Сейчас в теме
(8) мне надо дождаться завершения.
(7) вот как написать этот скриптик? А если 1сок несколько с одинаковым заголовком?
Добавлю ка я за скрипт еще 10.
11. dour-dead 271 20.12.12 14:49 Сейчас в теме
(9) fixin, это уже обсуждалось уже давно так что поиск рулит
10. fixin 4325 20.12.12 14:30 Сейчас в теме
А, ладно, надо увеличить мотивацию, добавляю еще 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}");
Показать
12. AnderWonder 27 20.12.12 14:52 Сейчас в теме
Попробуйте метод Exec, пример:
мShell=Новый COMОбъект("WScript.Shell");
Процесс=мShell.Exec(ИмяИПутьКИсполняемуФайлу);
OutStream=Процесс.StdOut;
Пока НЕ OutStream.AtEndOfStream Цикл
Ответ=ОКР(Число(OutStream.ReadLine())/1000);
КонецЦикла;
33. ybatiaev 59 07.07.20 17:06 Сейчас в теме
(12) Всё это у меня работало, как однажды стало запускаться не из под меня, а из-под USR1CV8. Тема старая, но сломал башку, пока это обнаружил.
Решилось функцией "ЗапуститьПриложение()". Единственно что плохо - это не возвращает параметры процесса.

Приложил картинку с настройкой(см ниже)
Вот если там стоит рекомендованный USR1CV8, тогда Shell будет под ним.И доступа к ресурсам может не быть

		
WshShell		= Новый COMОбъект("WScript.Shell"); 
Процесс		= WshShell.Exec(СтрокаКоманды); 


Если от текущего, как на картинке, то значит будет от того, кто зашел на сервер. И доступы все реально проверяемые.
Прикрепленные файлы:
13. AnderWonder 27 20.12.12 14:59 Сейчас в теме
Для ожидания завершения можно использовать:
Пока Процесс.Status=0 Цикл
КонецЦикла;
14. fixin 4325 20.12.12 15:17 Сейчас в теме
Пока что решил проблему через подключение однократное обработчика ожидания из модуля приложения.
А в обработчике шлю клавиши ALT + TAB.
Работает, но как-то с задержкой. Хотя лучше, чем ничего.
15. anterehin 15 20.12.12 15:25 Сейчас в теме
Друзья я не силён в скриптах и низкоуровневом программирование, но может кого то наведёт на мысль...

Перед запуском ЗапуститьПриложение(), получить дескриптор окна 1С, а после завершения вернуть ему фокус
16. anterehin 15 20.12.12 15:36 Сейчас в теме
WSHShell = СоздатьОбъект("WScript.Shell");
l = СоздатьОбъект("wbemscripting.swbemlocator");
oExec = WshShell.Exec("rundll32 kernel32,SleepEx");
s = l.connectserver();
ProcessID = s.get("win32_process.Handle="+oExec.ProcessID).ParentProcessID;
скопипастил отсюда: http://infostart.ru/public/142715/
Т.е. ID процесса есть, теперь нужно вернуть ему фокус
Синтаксис:
AppActivate(<Title>)
Назначение: активизирует указанное окно какого-либо приложения. Возвращает True в случае успеха и False в случае неудачи.
Параметры:
<Title> - заголовок окна приложения или идентификатор процесса.

Осталось слепить это и попробовать)...
ybatiaev; fixin; +2 Ответить
17. fixin 4325 20.12.12 15:39 Сейчас в теме
(16) там нюанс в том, что пока ты в исполнении кода, фокус может и не вернуться, как-то так.
ведь если я ставлю сендкейс Алт+таб после вызова метода запуститьПриложение, то фокус возвращается в соседнее с 1с окно, т.к. наверное 1с еще в статусе занято, но попробовать можно, по идее.
18. devel0per 1 20.12.12 15:54 Сейчас в теме
(17)
&НаКлиенте
Процедура Тест()
	ЗапуститьПриложение();
	Окно.Активизировать();
КонецПроцедуры
adhocprog; +1 Ответить
19. Kamikaze43 11 20.12.12 16:14 Сейчас в теме
(18) чуть поправлю )
ЗапуститьПриложение("calc",,Истина);
ЭтаФорма.Активизировать();
24. natarezn 20.12.14 18:47 Сейчас в теме
20. fixin 4325 20.12.12 16:24 Сейчас в теме
(18) Это 82? у меня 81, нужна совместимость
(19) так только форма аткивизируется, а приложение будет свернуто.
21. devel0per 1 20.12.12 21:42 Сейчас в теме
(20) Да, это 8.2. Не разобрался что речь о 8.1, т.к. топик в разделе "1C:Предприятие 8 » Программирование 1С 8.2"
22. devel0per 1 20.12.12 21:59 Сейчас в теме
(17) Для 8.1 идея такая: Из формы открываем маленькое модальное окошечко - "ланчер" при открытии "ланчера" выполняем запуск приложения, потом возвращаем фокус - ЭтаФорма.Активизировать(); далее закрываем "ланчер" и возвращаем из "ланчера" управление в родительскую форму.
34. Aero 25 03.12.21 05:37 Сейчас в теме
(16) Использование ID процесса не помогло, а вот использование заголовка окна помогло.

WSHShell = Новый COMОбъект("WScript.Shell");
WSHShell.AppActivate(ПолучитьЗаголовокПриложения());
23. tolyan_ekb 80 24.12.12 10:28 Сейчас в теме
Если из формы запустили приложение, то может что-то такое попроовать:

Процедура Проверка()
Если ВводДоступен() Тогда
    Сообщить("Приложение активно");
Иначе
Форма.Активизировать();
КонецЕсли; 
КонецПроцедуры;
Показать

В процедуре запуска приложения вызвать проверку
Если КодВозврата<>Неопределено Тогда 
Проверка();
КонецЕсли;
КонецЕсли;
25. natarezn 20.12.14 18:50 Сейчас в теме
как программист баз данных я должна сказать что эта событий не связана с 1с .Батник должен быть другой
26. natarezn 20.12.14 18:51 Сейчас в теме
Для тех , кто работал с большими локалками и временем, должен меня понять, что я не могу сделать деньги из плохо написанной модной системы , но мне тревожно , что еще скрипты выполняют :)
27. natarezn 20.12.14 18:52 Сейчас в теме
в свое время я выделяла 1с компьютер и ночью решала все проблемы. Это кризис для денежных вариантов схем бизнеса - нет компьютеров больше на складе. я не работаю в больших сетях. я только учусь учить.
28. natarezn 20.12.14 18:52 Сейчас в теме
если мы не успеваем с локалкой, то все :)
29. natarezn 20.12.14 19:05 Сейчас в теме
Эй мальчики ! где премия ? :) я решила !

ЗапуститьПриложение("C:\3.bat",,ложь);
ЭтаФорма.Активизировать();
intellekt48; +1 Ответить
30. natarezn 20.12.14 19:05 Сейчас в теме
31. zzigi 08.07.15 05:23 Сейчас в теме
Хреново ты решила. Активизировать форму не обязательно и можно дожидаться завершения приложения. Нужно в bat файле ключ /b ставить, тогда фокус теряться не будет
32. karpik666 4249 08.07.15 06:41 Сейчас в теме
я фигею с людей, которые пишут в темах двухлетней давности, где эти темы только находят. natarezn так вообще 7 сообщений, явно пытается startmoney накрутить.
35. Brawler 465 14.12.23 19:29 Сейчас в теме
Воскрешу как тему.

Обычные формы.

Асинх Процедура КнопкаВыполнитьНажатие(Кнопка)
	КодВозврат = Ждать ЗапуститьПриложениеАсинх("cmd.exe",, Истина);
	Сообщить(КодВозврат);
КонецПроцедуры


Но способ пашет пока окно 1С не ушло с экрана, например еще куда-то переключились.

Что под управляемыми формами происходит мне не актуально в данном случае.
36. Miket78 53 01.04.24 19:09 Сейчас в теме
Вот так фокус не уходит и черное окно не появляется.

Оболочка = Новый COMОбъект("Wscript.Shell");
КодВозврата = Оболочка.Run(СтрокаЗапускаКонвертера, 0, истина);
Оболочка = Неопределено;
37. Baszilio 28 20.03.25 22:22 Сейчас в теме
Коллеги, прошу прощения за некропостинг...

По итогу есть ли решение? Интересует больше для ОФ (для УФ предложенное не было необходимости пробовать)
Для отправки сообщения требуется регистрация/авторизация

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот