Форум: "WinAPI";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
ВнизЗапуск программы при выключении компьютера Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.04 c