![]() |
Programme beim Shutdown des PC's ausführen.
Hi Leute!
Weiss einer, wie man Programme ausführen kann, wenn der PC heruntergefahren wird? Ich will nämlich nen Prog schreiben, das alle Shutdowns protokolliert. Es soll aber NICHT (so wie die tollen freeware tools) im Hintergrund laufen. Hat einer ne Idee (oder auch mehrere ;))? Greetz, Teracon by Daniel B; Doppelpost gelöscht |
Hi Teracon,
das wird wohl so nicht gehen, weil ich noch nie davon gehört habe, dass Windows irgendwie Programme bei Shutdown startet (was ja auch eigentlich unsinnig ist). Ein Programm, das im Hintergrund läuft, ist aber kaum tragisch. Schreib ein nonVCL-Tool, dass aber in der Messageschleife jedes Mal 5 Sekunden Pause macht - das dürfte kaum Rechenleistung beanspruchen. Das Programm muss nur auf WM_CLOSE reagieren, also wird die Fensterprozedur auch nur zweimal benutzt: bei Start des Programms und beim Herunterfahren von Windows. Das alles benötigt so wenig Rechenkraft, dass es kaum eine Belastung des Systems gibt. MfG, d3g |
5 Sekunden Pause ist aber zu lange, ich würde eher etwas im Bereich von 150 ms vorschlagen.
P.S. Mein Rechner brauch nur zwei Sekunden, bis der aus ist (W2K). |
Hi Teracon,
Ich hab mal zur Verdeutlichung und weil mir langweilig war (die Ferien haben in SH heute begonnen *g*) so ein Programm geschrieben:
Code:
MfG,
{
-------------------------------------------------------------------------------- Shutdown Spy v 0.1 Copyright (c) 2002/07/03 by Benedikt Gollatz This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -------------------------------------------------------------------------------- } program ShutdownSpy; uses Windows, Messages, ShellAPI, SysUtils; const WINDOW_CLASS = 'ShutdownSpy'; WINDOW_TITLE = 'Shutdown Spy v. 0.1'; WM_TRAYEVENT = WM_USER + 1; var WndClass: TWndClassEx; Msg: TMsg; hPopupMenu: HMENU; nid: TNotifyIconData; function LeadingZero(n: Integer): String; begin Str(n, Result); if (n < 9) then Result := '0' + Result; end; function WndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var p: TPoint; SystemTime: _SYSTEMTIME; f: TextFile; begin Result := 0; case uMsg of WM_CREATE: begin hPopupMenu := CreatePopupMenu(); AppendMenu(hPopupMenu, MF_STRING, 1000, 'Exit'); SetMenuDefaultItem(hPopupMenu, 1000, 0); with nid do begin cbSize := SizeOf(TNotifyIconData); uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; uCallbackMessage := WM_TRAYEVENT; uID := 2000; hIcon := LoadIcon(0, IDI_APPLICATION); szTip := 'ShutdownSpy v 1.0'; Wnd := hWnd; end; Shell_NotifyIcon(NIM_ADD, @nid); end; WM_TRAYEVENT: if (lParam = WM_RBUTTONUP) then begin GetCursorPos(p); TrackPopupMenu(hPopupMenu, TPM_RIGHTALIGN or TPM_RIGHTBUTTON, p.x, p.y, 0, hWnd, nil); end; WM_COMMAND: if (LoWord(wParam) = 1000) then SendMessage(hWnd, WM_CLOSE, 0, 0); WM_QUERYENDSESSION: begin AssignFile(f, 'log.txt'); if (FileExists('log.txt')) then Append(f) else Rewrite(f); GetSystemTime(SystemTime); if (lParam or Integer(ENDSESSION_LOGOFF) = lParam) then WriteLn(f, 'The user has logged off at ', LeadingZero(SystemTime.wYear), '/', LeadingZero(SystemTime.wMonth), '/', LeadingZero(SystemTime.wDay), ' ', LeadingZero(SystemTime.wHour), ':', LeadingZero(SystemTime.wMinute), ':', LeadingZero(SystemTime.wSecond), '.') else WriteLn(f, 'The system was shut down at ', LeadingZero(SystemTime.wYear), '/', LeadingZero(SystemTime.wMonth), '/', LeadingZero(SystemTime.wDay), ' ', LeadingZero(SystemTime.wHour), ':', LeadingZero(SystemTime.wMinute), ':', LeadingZero(SystemTime.wSecond), '.'); CloseFile(f); SendMessage(hWnd, WM_CLOSE, 0, 0); end; WM_DESTROY: begin DestroyMenu(hPopupMenu); Shell_NotifyIcon(NIM_DELETE, @nid); PostQuitMessage(0); end; else Result := DefWindowProc(hWnd, uMsg, wParam, lParam); end; end; begin with WndClass do begin cbSize := SizeOf(TWndClassEx); style := 0; lpfnWndProc := @WndProc; cbClsExtra := 0; cbWndExtra := 0; hInstance := SysInit.hInstance; hIcon := LoadIcon(0, IDI_APPLICATION); hCursor := LoadCursor(0, IDC_ARROW); hbrBackground := COLOR_APPWORKSPACE; lpszMenuName := ''; lpszClassName := WINDOW_CLASS; hIconSm := 0; end; RegisterClassEx(WndClass); CreateWindowEx(0, WINDOW_CLASS, WINDOW_TITLE, 0, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), 0, 0, 0, 0, hInstance, nil); while (GetMessage(Msg, 0, 0, 0)) do begin TranslateMessage(Msg); DispatchMessage(Msg); Sleep(150); end; end. d3g |
Guten Morgen.
1. Wenn du diese Funktion einbindest:
Code:
kannst du auf die "SysUtils.pas" verzichten, und dein Programm reduziert sich von 43,5k auf 19k.
function fileexists(const szFilename: string): boolean;
var Handle : THandle; FindData : TWin32FindData; begin Handle := FindFirstFile(pchar(szFilename),FindData); Result := (Handle <> INVALID_HANDLE_VALUE); if(Result) then Windows.FindClose(Handle); end; 2. Anstelle von "GetSystemTime" würde ich "GetLocalTime" vorschlagen. 3. Die Anweisung "sleep(150)" dient wofür? Um die Bearbeitung zu verzögern, damit man die Protokollierung ausführen kann? Hm, bei mir hat´s auch ohne geklappt. Aber ich lasse mich da gern belehren. <Edit> Machen wir doch noch folgendes:
Code:
Und dann erweitern wir WM_CREATE:
function inttostr(const i : integer): string;
begin Result := ''; str(i,Result); end; // zu finden im EDH --> function GetWindowsUpTime: String; const DAYS : Integer = 1000 * 60 * 60 * 24; HOURS : Integer = 1000 * 60 * 60; MINUTES : Integer = 1000 * 60; SECONDS : Integer = 1000; var Ticks : Integer; day, hour, min, sec : Integer; begin Ticks := GetTickCount; //GetTickCount gibt die Zeit nach einem Windowstart an day := Ticks div DAYS; //Tage dec(Ticks, day * DAYS); hour := Ticks div HOURS; //Stunden dec(Ticks, hour * HOURS); min := Ticks div MINUTES; //Minuten dec(Ticks, min * MINUTES); sec := Ticks div SECONDS; //Sekunden Result := IntToStr(day) + ' days, '+ IntToStr(hour) + ' hours, '+ IntToStr(min) + ' min, '+ IntToStr(sec) + ' sec'; end;
Code:
Fertig, bei 20k Größe. :wink:
WM_CREATE:
begin AssignFile(f, 'log.txt'); if (FileExists('log.txt')) then Append(f) else Rewrite(f); GetLocalTime(SystemTime); WriteLn(f, 'ShutdownSpy launched at ', LeadingZero(SystemTime.wYear), '/', LeadingZero(SystemTime.wMonth), '/', LeadingZero(SystemTime.wDay), ' ', LeadingZero(SystemTime.wHour), ':', LeadingZero(SystemTime.wMinute), ':', LeadingZero(SystemTime.wSecond), '.'); WriteLn(f, 'OS is running since ' + GetWindowsUpTime); CloseFile(f); ... end; </Edit> Gruß, Mathias, |
Wow
Hi Leute!
Wow, danke für dies umfassende Hilfe! Verdammt, wo habt ihr so gut nonVCL coden gelernt? Da hab ich keine Ahnung! Aber der Code von euch funzt. Danke! Teracon |
Geh mal auf meine Homepage.
Achtung: Soll nicht heißen, dass sie es dort gelernt haben :mrgreen:. |
@Luckie: hab ich auch nicht *g*
@MathiasSimmack: war (bin) gerade 1200 km von meinem PC entfernt, deswegen jetzt eine Antwort. Ich kümmer mich morgen darum, ich downe nämlich gerade an diesem PC Delphi 6 Personal, das dauert noch ein bisschen. MfG, d3g |
Zitat:
Zitat:
|
1200 km um einen PC mit DSL und Flate-Rate zu finden? :shock: Wo wohnst du im Gottes Willen? :roll:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz