![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запуск программы при выключении компьютера
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 в эксплорере (вот и будет тебе експлорер "запускалкой") он то практически всегда запущен (правде наверное придется отслеживать копии, а то можно несколко прог запустить).