Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.032 c
14-1095687816
setter
2004-09-20 17:43
2004.10.10
UnFDISK


14-1095494946
Новенький
2004-09-18 12:09
2004.10.10
Подскажите,где мона скачать Turbo Pascal for Win?


1-1095961383
Роман
2004-09-23 21:43
2004.10.10
String -> Char


1-1096030702
Mirror
2004-09-24 16:58
2004.10.10
GetLogicalDrives


1-1096034724
ShproTT
2004-09-24 18:05
2004.10.10
Delphi+MS Word





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский