AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Programme beim Shutdown des PC's ausführen.
Thema durchsuchen
Ansicht
Themen-Optionen

Programme beim Shutdown des PC's ausführen.

Ein Thema von Teracon · begonnen am 3. Jul 2002 · letzter Beitrag vom 27. Nov 2004
Antwort Antwort
Seite 1 von 2  1 2      
Teracon

Registriert seit: 3. Jul 2002
3 Beiträge
 
#1

Programme beim Shutdown des PC's ausführen.

  Alt 3. Jul 2002, 18:04
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
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#2
  Alt 3. Jul 2002, 18: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
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#3
  Alt 3. Jul 2002, 19: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).
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#4
  Alt 3. Jul 2002, 20: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
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5
  Alt 4. Jul 2002, 09: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.

</Edit>

Gruß,
Mathias,
  Mit Zitat antworten Zitat
Teracon

Registriert seit: 3. Jul 2002
3 Beiträge
 
#6

Wow

  Alt 4. Jul 2002, 13:20
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7
  Alt 4. Jul 2002, 13:32
Geh mal auf meine Homepage.

Achtung: Soll nicht heißen, dass sie es dort gelernt haben .
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#8
  Alt 15. Jul 2002, 22: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
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#9
  Alt 16. Jul 2002, 11:59
Zitat von d3g:
war (bin) gerade 1200 km von meinem PC entfernt
Wow, du musst ja lange Arme haben ...

Zitat:
Ich kümmer mich morgen darum
Worum? - Darum?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10
  Alt 16. Jul 2002, 12:05
1200 km um einen PC mit DSL und Flate-Rate zu finden? Wo wohnst du im Gottes Willen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:27 Uhr.
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