Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Programme beim Shutdown des PC's ausführen. (https://www.delphipraxis.net/326-programme-beim-shutdown-des-pcs-ausfuehren.html)

Teracon 3. Jul 2002 17:04


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

d3g 3. Jul 2002 17:15

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

sakura 3. Jul 2002 18:09

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).

d3g 3. Jul 2002 19:40

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:
{
--------------------------------------------------------------------------------

     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.
MfG,
d3g

MathiasSimmack 4. Jul 2002 08:04

Guten Morgen.

1. Wenn du diese Funktion einbindest:
Code:
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;
kannst du auf die "SysUtils.pas" verzichten, und dein Programm reduziert sich von 43,5k auf 19k.

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:
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;
Und dann erweitern wir WM_CREATE:
Code:
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;
Fertig, bei 20k Größe. :wink:

</Edit>

Gruß,
Mathias,

Teracon 4. Jul 2002 12:20

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

Luckie 4. Jul 2002 12:32

Geh mal auf meine Homepage.

Achtung: Soll nicht heißen, dass sie es dort gelernt haben :mrgreen:.

d3g 15. Jul 2002 21:07

@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

MathiasSimmack 16. Jul 2002 10:59

Zitat:

Zitat von d3g
war (bin) gerade 1200 km von meinem PC entfernt

Wow, du musst ja lange Arme haben ... :twisted:

Zitat:

Ich kümmer mich morgen darum
Worum? - Darum?

Luckie 16. Jul 2002 11:05

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 04:48 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz