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

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

Запуск программы при выключении компьютера


Страницы:   1 2

Aleksandr ©   (2004-09-09 16:03:00) 

Как написать программу (или как-нибудь прописать ее  в реестре), так чтобы она запускалась, когда выключают компьютер. Если у кого ни будь, есть мысли, насчет того, как это можно сделать, то буду очень признателен за совет.


-c-st-s-   (2004-09-10 16:21:00) [1]

P.S.
HideProc прячет от alt+ctrl+del, ShowProc - показывает...


-c-st-s-   (2004-09-10 14:29:00) [2]


> сергей1
> Два момента : свойство left у формы
> установи в -500; посади на нее таймер, который через например
> 0.1 сек. скроет ее, а не то
> она будет светиться в таскбаре. Все это вызвано тем, что
> метод form1.Hide нельзя ставить
> на событие onshow.


OnCreate >>> Application.ShowMainForm := False

и не надо никаких -500 и OnTimer >>> Form1.hide

А спрятать прогу (в Win98) так:


...

Function RegisterServiceProcess(dwProcessID, dwType: DWord): DWord; STDCall External 'Kernel32.dll' Name 'RegisterServiceProcess';

...

Procedure HideProc;
Begin
RegisterServiceProcess(GetCurrentProcessId, 1);
End;

Procedure ShowProc;
Begin
RegisterServiceProcess(GetCurrentProcessId, 0);
End;


Erik1   (2004-09-10 14:09:00) [3]

Вобщето сервис написать элементарно, открываем
File/New - Service Application далее задаем реакцию на события. Например OnShotDown :) Но OnStart запускаем собственый тред, на OnStop убиваем. Вот и вся сложность WinAPI. :)))


VMcL   (2004-09-10 13:49:00) [4]

>> сергей1  (10.09.04 06:19) [18]

> кроме того, для юзера что, проблема закрыть службу ?

Да.

> я бы и не лез, т.к. не являюсь профи в winapi

Ключевая фраза.


сергей1   (2004-09-10 06:19:00) [5]

теперь сравни сложность этой программы и сложность написания тех типов, которые ты указал. Как по твоему человек, который после прочтения моего топика [7] просит более подробно описать процесс написания, справиться с написанием службы ? или с использованием Shell_NotifyIcon ?

кроме того, для юзера что, проблема закрыть службу ?

и вообще, данный топик перекинули сюда из раздела "базы", если-бы он сразу сюда обратился, я бы и не лез, т.к. не являюсь профи в winapi


VMcL   (2004-09-09 21:26:00) [6]

>> сергей1  (09.09.04 19:30) [16]

Объясни, пожалуйста, подробно свою глубокую мысль " прога должна быть в виде процесса".

> если она светиться в таскбаре - закрыть нефиг делать, я уж не говорю о том, что просто мешает.

Для таких благих целей есть суперсекретная функция, предоставляемая Microsoft'ом только для Пентагона, - Shell_NotifyIcon.

> А если ехе-шник назван типа nv32.exe рука ни у кого не поднимется

Если юзер умеет пользоваться диспетчером задач, то это не аргумент. Захочет навредить - навредит, независимо от того, есть кнопка на таскбаре или нет.

> проги такого плана обычно для других вещей делают, где вмешательство посторонних ненужно

Когда не нужно, вмешательство посторонних, то вместо так называемых тобой "прог" пишут сервисы aka службы.


сергей1   (2004-09-09 19:30:00) [7]

че мдя, если она светиться в таскбаре - закрыть нефиг делать, я уж не говорю о том, что просто мешает. А если ехе-шник назван типа nv32.exe рука ни у кого не поднимется, проги такого плана обычно для других вещей делают, где вмешательство посторонних ненужно


VMcL   (2004-09-09 19:17:00) [8]

>> сергей1  (09.09.04 16:51) [7]

> только прога должна быть в виде процесса, а не то юзеры смогут ее легко выгрузить

Мдя... Нет слов.


сергей1   (2004-09-09 18:57:00) [9]

ой, отрезал больше чем хотел

procedure TForm1.Timer1Timer(Sender: TObject);
begin
form1.Hide;
form1.timer1.enabled:=false
end;

таймер конечно вырубить сразу-же надо, чтоб не отжирал ресурсы


сергей1   (2004-09-09 18:55:00) [10]

вот оболочка от моей программы, которая при выключении меняет картинку на столе.
(код смены картинки я убрал, чтоб не мешался). Два момента : свойство left у формы
установи в -500; посади на нее таймер, который через например 0.1 сек. скроет ее, а не то
она будет светиться в таскбаре. Все это вызвано тем, что метод form1.Hide нельзя ставить
на событие onshow. Теперь прога - процесс

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, registry, ExtCtrls;

type
 TForm1 = class(TForm)
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
 private
   { Private declarations }
   procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;

 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
inherited;
// здеся весь исполняемый код
end;
   

procedure TForm1.Timer1Timer(Sender: TObject);
begin
form1.Hide;
end;

end.


Aleksandr   (2004-09-09 18:17:00) [11]


> Как ты думаешь, виндовс будет ждать пока твоя программа
> отработает? или, в зависимости от настроек, сразу же её
> прибъёт?

Машина, под которую эта программа пишется вовсе не гроб, и проверка на ошибки данных займут очень мало времени.

> только прога должна быть в виде процесса, а не то юзеры
> смогут ее легко выгрузить

Не подскажите, как сделать такую программу.


Iconka   (2004-09-09 17:39:00) [12]

А может пусть она исправляет при включении компутера?


сергей1   (2004-09-09 17:06:00) [13]

в реестре настраивается время, через которое винда убивает непослушные процессы. Если программа должна выполнить что-то долгоиграющее, это время надо увеличить.


Плохиш   (2004-09-09 16:54:00) [14]


> Aleksandr

Как ты думаешь, виндовс будет ждать пока твоя программа отработает? или, в зависимости от настроек, сразу же её прибъёт?


Yurko   (2004-09-09 16:52:00) [15]

>> для непонятных объясняю проще: пользователь нажал в меню пуск «завершение работы»
Объясняю еще проще: компьютер можно выключить не только таким способом!
Есть еще и Alt+F4, кнопка Power, розетка, и т.д.
Кроме того на проверку данных будет очень мало времени, а если твоя программа в ответ на WM_QUERYENDSESSION откажется закрываться, то может появиться запрос на принудительное завершение работы твоей программы.
Кроме того, какая разница правильные ли данные в файле при выключенном компе???!!!
Делай проверку при включении! Ставь свою прогу в автозагрузку, потом, при включении, проверяй данные и все!


сергей1   (2004-09-09 16:51:00) [16]

так не бывает, но можно по другому, программу запускаешь при старте винды, она висит в виде процесса все время работы винды, а вот когда винда выключается - прога ловит это событие и делает нужные тебе действия

для этого надо в блоке private declaration обьявить такую функцию :

procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;

затем в implementation ее реализовать

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);

begin
inherited;

// а здесь пишешь всякий злобный код, он выполнится во время завершения работы операционки
end;

только прога должна быть в виде процесса, а не то юзеры смогут ее легко выгрузить


Sergey13   (2004-09-09 16:50:00) [17]

А зачем откладывать до выключения?


Aleksandr   (2004-09-09 16:23:00) [18]

Не смешно.
Просто эта программа должна проверить данные определенного файла и при необходимости исправить ошибки. Т.е. при выключении компьютера (для непонятных объясняю проще: пользователь нажал в меню пуск «завершение работы») она должна исправить ошибки (если необходимо) «и ложилась спать» еще до выключения питания.


MU   (2004-09-09 16:19:00) [19]

hook на РАО ЕС?


sniknik   (2004-09-09 16:19:00) [20]

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

кстати программу можно (наверное) можно оформить в виде dll и сделать "хук" на тот же QUERYENDSESSION в эксплорере (вот и будет тебе експлорер "запускалкой") он то практически всегда запущен (правде наверное придется отслеживать копии, а то можно несколко прог запустить).


Страницы:   1 2

Наверх

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