Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

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

 
Aleksandr   (2004-09-09 16:03) [0]

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


 
Ega23 ©   (2004-09-09 16:07) [1]

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


 
megabyte ©   (2004-09-09 16:17) [2]


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

Он, наверное, имел ввиду, чтобы прога включалась перед выключением компа?
Если нет, то было бы интересно узнать метод... :)


 
sniknik ©   (2004-09-09 16:19) [3]

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

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


 
MU ©   (2004-09-09 16:19) [4]

hook на РАО ЕС?


 
Aleksandr   (2004-09-09 16:23) [5]

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


 
Sergey13 ©   (2004-09-09 16:50) [6]

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


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

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

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

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

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

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);

begin
inherited;

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

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


 
Yurko   (2004-09-09 16:52) [8]

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


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


> Aleksandr

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


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

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


 
Iconka ©   (2004-09-09 17:39) [11]

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


 
Aleksandr   (2004-09-09 18:17) [12]


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

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

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

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


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

вот оболочка от моей программы, которая при выключении меняет картинку на столе.
(код смены картинки я убрал, чтоб не мешался). Два момента : свойство 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.


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

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

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

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


 
VMcL ©   (2004-09-09 19:17) [15]

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

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

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


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

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


 
VMcL ©   (2004-09-09 21:26) [17]

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

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

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

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

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

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

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

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


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

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

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

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


 
VMcL ©   (2004-09-10 13:49) [19]

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

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

Да.

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

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


 
Erik1   (2004-09-10 14:09) [20]

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


 
-c-st-s- ©   (2004-09-10 14:29) [21]


> сергей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;


 
-c-st-s- ©   (2004-09-10 16:21) [22]

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



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.057 c
14-1095840635
kaZaNoVa
2004-09-22 12:10
2004.10.10
2 Системы или Защита/изменение файлов и Реестра.


14-1094827567
Anatoly Podgoretsky
2004-09-10 18:46
2004.10.10
Об учебе в России.


1-1095742277
Gero
2004-09-21 08:51
2004.10.10
Рисование на рамке закладки TTabControl


1-1095765434
demidoff
2004-09-21 15:17
2004.10.10
Простой вопрос новичка про указатели


1-1095758544
kand
2004-09-21 13:22
2004.10.10
Как "выдернуть" из DataTimePicker или MonthCalendar номер месяца?