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

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 4285 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 4285 20.12.12 14:25 Сейчас в теме
(8) мне надо дождаться завершения.
(7) вот как написать этот скриптик? А если 1сок несколько с одинаковым заголовком?
Добавлю ка я за скрипт еще 10.
11. dour-dead 271 20.12.12 14:49 Сейчас в теме
(9) fixin, это уже обсуждалось уже давно так что поиск рулит
10. fixin 4285 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 4285 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 4285 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 4285 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 34 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 3958 08.07.15 06:41 Сейчас в теме
я фигею с людей, которые пишут в темах двухлетней давности, где эти темы только находят. natarezn так вообще 7 сообщений, явно пытается startmoney накрутить.
35. Brawler 461 14.12.23 19:29 Сейчас в теме
Воскрешу как тему.

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

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


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

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

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

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

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