Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужно найти и показать окно. Запуск через планировщик при старте. [D7, Win2k, WinXP]


LexaTyukha ©   (2004-04-07 12:03:00) 

Добрый день!
 Исходная ситуация: Есть приложение состоящее из главной формы и двух потоков.
У Application'а -

 Application.Initialize;
 ExtendedStyle:=GetWindowLong(application.Handle,GWL_EXSTYLE);
 SetWindowLong(Application.Handle, GWL_EXSTYLE,ExtendedStyle or WS_EX_TOOLWINDOW);
 Application.Title := 'XChange';
 Application.CreateForm(TfmMain, fmMain);
 Application.Run;

(это сделано что б спрятать приложение из TaskBar'a)
При старте приложения сразу же вызывается
ShowWindow(fmMain.Handle,SW_HIDE);

Второе приложение должно находить первое приложение и уметь показывать, прятать и закрывать его (своеобразный менеджер приложений)что выполняется следующими командами:

 ShowWindow(SelWindow,SW_HIDE);
 ShowWindow(SelWindow,SW_RESTORE);
 PostMessage(SelWindow,WM_CLOSE,0,0);

SelWindow:HWND устанавливается после такой процедуры:

 EnumWindows(@ParentTree, 0);

ParentTree строит список окон с их хэндалми.
Все это работает и функция

 hndl:=FindWindow('TfmMain','XChangeMainWindow');

возвращает хэндл с которым можно работать.

 Проблема начинается когда первое приложение запускается планировщиком Windows по расписанию "При включении компьютера", т.е. до того как юзер залогинится. Потоки работают, но после того как юзер залогинится

 EnumWindows(@ParentTree, 0);

как и

 hndl:=FindWindow('TfmMain','XChangeMainWindow');

не находят окно первого приложения. В процессах видно первое приложение как XChange.exe.
 Вопрос: почему так происходит? Потоки запускаются в OnCreate формы, т.е. после создания ее (OldCreationOrder=false). Значит окно создается. Почему же его нельзя найти? XChange.exe запущен от имени локального юзера, под которым и логинется пользователь.
Ну и собственно, какой выход из этой ситуевины видите Вы?
 Огромное спасибо за Ваши ответы и предложения!


BiN   (2004-04-19 12:27:00) [1]

.. Можно ли как-то ее(программу) вытянуть в текущий (десктоп)?

Да, ты можешь указать режим взаимодействия сервиса с рабочим столом.
Если будешь писать только на API, то читай про ChangeServiceConfig. Иначе при использовании TService смотри свойство Interactive.
Но imho лучше избегай использование интефейсных элементов в сервисах.


LexaTyukha   (2004-04-19 12:02:00) [2]


> Ответ прост: пиши свой сервис


Похоже да...

А по поводу "создается на другом дэсктопе". Можно ли как-то ее(программу) вытянуть в текущий?


BiN   (2004-04-19 11:04:00) [3]

>> LexaTyukha
Программа моя...
Я пробовал еще запускать ее как сервис с помощью srvany


Ответ прост: пиши свой сервис.


LexaTyukha   (2004-04-19 10:57:00) [4]


> Может, ее просто в автозагрузку поставить ?


До логина пользователя запускаться должна...
Я пробовал еще запускать ее как сервис с помощью srvany. Такой подход отвечает требованиям, но... При остановке сервиса система просто срубает задачу, не дожидаясь остановки потоков. А они в это время могут выполнять некую работу...


Игорь Шевченко   (2004-04-16 21:02:00) [5]


> Дело в том что мне нужно запустить программу при включении
> компа.


Может, ее просто в автозагрузку поставить ?


LexaTyukha   (2004-04-16 10:20:00) [6]

Ясно. Спасибо! Но это немного не то... Дело в том что мне нужно запустить программу при включении компа. Т.е. к примеру ночью комп перегрузился (посадка напряжения), юзер естественно залогинится только утром, а программа должна работать все время. В назначенных заданиях такой параметр указать можно, а в команде АТ - нельзя... А если создать задачу коммандой АТ, а потом отредактировать в папке назначенных заданий она(задача) пропадает из списка задач команды АТ...


Игорь Шевченко   (2004-04-15 14:11:00) [7]

at time /Interactive command
/Interactive - allows job to interact with desktop of the user who is logged on at the time the job runs.


LexaTyukha   (2004-04-15 10:07:00) [8]

Что-то я посмотрел опции планировщика и не нашел сего волшебного слова. Есть похожая опция в управлении службами. Но это ж совсем другое... Может я не там смотрю? Объясните пожалуйста! (WinXP, Win2K).


Игорь Шевченко   (2004-04-14 14:27:00) [9]

LexaTyukha   (14.04.04 13:41)

В планировщике волшебное слово Interactive попробуй сказать.


LexaTyukha   (2004-04-14 13:41:00) [10]

Программа моя. Если не прятать тоже не показывается...


Игорь Шевченко   (2004-04-09 21:21:00) [11]

LexaTyukha   (09.04.04 14:44)

А окно программы, запускаемой из-под планировщика, показывается, если его не прятать ? Насколька я понимаю, это же твоя программа?


LexaTyukha   (2004-04-09 14:44:00) [12]

И никак оттуда ее перевести в текущий нельзя?

А что, при старте системы(до логина) создается некий Desktop?


Игорь Шевченко   (2004-04-09 13:39:00) [13]


> Еще я заметил что первая программа стартует под svchost.exe
> ...


И ее окно вполне может быть на другом Desktop'е


LexaTyukha   (2004-04-09 11:48:00) [14]

Еще я заметил что первая программа стартует под svchost.exe ...


Наверх

Титульная страница Поиск, карта сайта Написать письмо