Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Закрытие системных предупреждений (число прочтений - 7017 )
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Закрытие системных предупреждений
02. Ноября 2007 :: 11:25
Печать  
Вот опять я сосвоими терминалами.
Суть задачи следующая:
Требуется выгнать юзьвера из базы.
В принципе все работает, вот только когда до Програмного вызова ЗавершитьРаботусСистемы() пользователю выбросило "Сохранить документ" "Да нет Отмена" в интерактивнгом режиме сохранения документа и он никак не него не реагирует, то пока он не ответит из системы его не выгонишь.
Как побороть?
Использование Сервис.ЗакрытьВсеОкна() не помагает.
Причем самое интересное что Сервис.ОбработкаОжидания("МоеЗавершение")
где в МоеЗавершение() есть предупреждение("Выходим из системы")
выпрыгрвает поверх системного "Сохранить документ".

  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Закрытие системных предупреждений
Ответ #1 - 02. Ноября 2007 :: 11:32
Печать  
Код
Выбрать все
Процедура Terminate_process(PC, Процесс, Пользователь) Экспорт

	Если ПустоеЗначение(Пользователь) = 1 Тогда
		Пользователь = ИмяПользователя();
	КонецЕсли;

	Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
	Скрипт.Language = "vbscript";
	Скрипт.AddCode("
		|Function Func()
		|	Set objWMIService = GetObject(""winmgmts:{impersonationLevel=impersonate}!\\" + PC + "\root\cimv2"")
		|	Set colProcessList = objWMIService.ExecQuery (""Select * from Win32_Process"")
		|	For Each objProcess in colProcessList
		|		colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain)
		|		If objProcess.Name = """ + Процесс + """ And strNameOfUser = """ + Пользователь + """ Then
		|		    objProcess.Terminate()
		|		End if
		|	Next
		|End Function
		|");
	Скрипт.Run("Func");

КонецПроцедуры

 



Самый продуктивный метод Смех
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Закрытие системных предупреждений
Ответ #2 - 02. Ноября 2007 :: 11:35
Печать  
Улыбка Ну для SQL может быть и продуктивный (и то спорно)

(0) А какой ответ давать ты всегда знаешь однозначно? А может после того, как ты скажешь первый раз "да" тебя потом спросят ещё о чём-либо? а потом ещё...
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Закрытие системных предупреждений
Ответ #3 - 02. Ноября 2007 :: 11:43
Печать  
JohnyDeath писал(а) 02. Ноября 2007 :: 11:35:

(0) А какой ответ давать ты всегда знаешь однозначно? А может после того, как ты скажешь первый раз "да" тебя потом спросят ещё о чём-либо? а потом ещё...


Тут ответ все "Нет" ну а для установки времени "Отмена" нечего ушами хлопать когда у тебе спрашуют.
Но самое главно как эти системные предупреждения закрыть.
У них ведь ТаймАута как назло нету.
  
Наверх
 
IP записан
 
Valet
Full Member
***
Отсутствует



Сообщений: 141
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Закрытие системных предупреждений
Ответ #4 - 02. Ноября 2007 :: 11:50
Печать  
Как идея:
закрыть посредством "DynamicWrapper"
найти окошко через FindWindow и  затем закрыть его.
  

/ Лень - двигатель прогресса. /
Наверх
ICQ  
IP записан
 
Valet
Full Member
***
Отсутствует



Сообщений: 141
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Закрытие системных предупреждений
Ответ #5 - 02. Ноября 2007 :: 13:11
Печать  
Попробуй этот код (конечно на тестовой)
Я на пустой DBF щас попробовал - вроде не требует переиндексацию.

Он сначала предлагает сохранить, а при следующей итерации - удаляет окошко с вопросом и завершает без сохранения.
Стандартная обработка ожидания не работает - поэтому пришлось ФормЭкс прикрутить.

Код
Выбрать все
Перем фл;
//**************************************************
Процедура Тест()
	Если фл=0 Тогда
		фл=фл+1;
		ЗавершитьРаботуСистемы(1);
	Иначе
		Wrap = CreateObject("DynamicWrapper");
		Wrap.Register("USER32.DLL", "FindWindow","i=ls", "f=s", "r=l");
		Wrap.Register("USER32.DLL", "DestroyWindow","i=l", "f=s", "r=l");
		хэндл_вопроса=Wrap.FindWindow(0,"1С:Предприятие");
		Wrap.DestroyWindow(хэндл_вопроса);
		ЗавершитьРаботуСистемы(0);
	КонецЕсли;
КонецПроцедуры
//**************************************************
Процедура ПриНачалеРаботыСистемы()
	фл=0;
	ЗагрузитьВнешнююКомпоненту("FormEx.dll");
    FormEx_Service = СоздатьОбъект("Сервис");
	FormEx_Service.ОбработкаОжидания("Тест",60000);
КонецПроцедуры    

  

/ Лень - двигатель прогресса. /
Наверх
ICQ  
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Закрытие системных предупреждений
Ответ #6 - 02. Ноября 2007 :: 13:21
Печать  
Валиться с ошибкой:
Wrap = CreateObject("DynamicWrapper");                              
{Глобальный модуль(342)}: Неудачная попытка создания объекта (DynamicWrapper)

А где ты взял это объект?
  
Наверх
 
IP записан
 
Valet
Full Member
***
Отсутствует



Сообщений: 141
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Закрытие системных предупреждений
Ответ #7 - 02. Ноября 2007 :: 13:23
Печать  
varelchik писал(а) 02. Ноября 2007 :: 13:21:
Валиться с ошибкой:
Wrap = CreateObject("DynamicWrapper");                              
{Глобальный модуль(342)}: Неудачная попытка создания объекта (DynamicWrapper)

А где ты взял это объект?

http://www.script-coding.info/dynwrap.html
её зарегить надо (regsvr32)

  

/ Лень - двигатель прогресса. /
Наверх
ICQ  
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Закрытие системных предупреждений
Ответ #8 - 02. Ноября 2007 :: 13:30
Печать  
ВАХ!
Какой маладец!
Заработало!
Огромное Сенкс!
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Закрытие системных предупреждений
Ответ #9 - 02. Ноября 2007 :: 13:36
Печать  
Да вот только есть еще одно но!
Диалоги типа:
Поиск по номеру
Параметры журнала
Время документа
ну и таму подобные
Я так понимаю надо попытаться найти по заголовку окна такие окна и их тоже погрохать?
  
Наверх
 
IP записан
 
Valet
Full Member
***
Отсутствует



Сообщений: 141
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Закрытие системных предупреждений
Ответ #10 - 02. Ноября 2007 :: 13:46
Печать  
varelchik писал(а) 02. Ноября 2007 :: 13:36:
Да вот только есть еще одно но!
Диалоги типа:
Поиск по номеру
Параметры журнала
Время документа
ну и таму подобные
Я так понимаю надо попытаться найти по заголовку окна такие окна и их тоже погрохать?


В принципе прокатит.
Мне не понравилось что DestroyWindow так окошко удаляет что 1С неработоспособна после.
Но с другой стороны, что ожидать еще от такого "варварского" способа Улыбка
  

/ Лень - двигатель прогресса. /
Наверх
ICQ  
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Закрытие системных предупреждений
Ответ #11 - 02. Ноября 2007 :: 14:05
Печать  
А как можно получить Название окна?
Типа Сохранить документ это понятно у него есть 1С:Предприятие
А как вообще проверить есть открытые Окна и считать у них заголовок?
Малоли что не учтено:
Скажем Модальные окна Обработок , у них же необязательно будет 1С:Предприятие.
  
Наверх
 
IP записан
 
Valet
Full Member
***
Отсутствует



Сообщений: 141
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Закрытие системных предупреждений
Ответ #12 - 02. Ноября 2007 :: 14:27
Печать  
Как идея:
Возможно у этих окошек хэндл родительского окна это хэндл 1С
В принципе можно перебрать все окошки и сравнить его. и у этих окошек выдирать заголовок.
Это надо у "гуру" узнать или каким  нить Spy посмотреть handle.
Модуль с кучей winapi функций это будет чтото страшное. Улыбка


  

/ Лень - двигатель прогресса. /
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Закрытие системных предупреждений
Ответ #13 - 02. Ноября 2007 :: 14:42
Печать  
Можно ещё поубивать все "видимые" окна. Кроме главного. А видимые будут только "модальные", включая "вопросные".
Продвинутый таск-менеджер лежит тут (для русских - бесплатно). Там, в часности, можно посмотреть окна конкретного процесса и чё-нить выяснить для себя  Подмигивание
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: Закрытие системных предупреждений
Ответ #14 - 05. Ноября 2007 :: 13:06
Печать  
Начал пробовать так:
Функция УничтожитьОкно()
     Сп=СоздатьОбъект("СписокЗначений");
     Сп.ДобавитьЗначение("1С:Предприятие");
     Сп.ДобавитьЗначение("Параметры журнала");
     Сп.ДобавитьЗначение("Время документа");
     Сп.ДобавитьЗначение("Поиск документа по номеру");
     Сп.ДобавитьЗначение("Панели инструментов");
     Сп.ДобавитьЗначение("О программе");
     Сп.ДобавитьЗначение("Настройка параметров системы");
     Wrap = CreateObject("DynamicWrapper");                              
     Wrap.Register("USER32.DLL", "FindWindow","i=ls", "f=s", "r=l");
     Wrap.Register("USER32.DLL", "DestroyWindow","i=l", "f=s", "r=l");
     Для н=1 По Сп.РазмерСписка() Цикл
           хэндл_вопроса=Wrap.FindWindow(0,Сп.ПолучитьЗначение(н));
           Если хэндл_вопроса<>0 Тогда
                 Wrap.DestroyWindow(хэндл_вопроса);
                 ЗавершитьРаботуСистемы(0);
           КонецЕсли;
     КонецЦикла;
     Возврат 1;
КонецФункции
Единственное значение после которого 1С таки завершается это "1С:Предприятие" (причем нормально).
При остальных значениях окна закрываютья но 1С нехочет ЗавершатьРаботуСистемы() и причем после уничтожения окна уже ни на что не реагирует.
Как же тепереча быть?
Может "ГУРУ" посоветують?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать