Avatar billede gamer61 Nybegynder
27. februar 2003 - 01:43 Der er 20 kommentarer og
2 løsninger

Forced shutdown..... how?

Jeg skal bare have en kode jeg kan skrive i en knaps OnClick event der laver en forced shutdown. Den skal virke i win 2k men må også meget gerne virke i alle de andre versioner. Jeg har kigget efter en løsning men jeg syns de posts der har været er for lange og overskuelige. Jeg har set borrisholts shutdown prg men jeg synes ikke at kunne finde det jeg søger. Altså hvad jeg skal bruge er en knap der tvinger windows til at lukke. Hvis nogen har tid/lyst til at lave et eksempel poster jeg også min mail adresse.

captain_denmark@hotmail.com
Findes også på http://home20.inet.tele.dk/pcfreak

På forhånd tak :)
Avatar billede abpdk Nybegynder
27. februar 2003 - 01:54 #1
Avatar billede borrisholt Novice
27. februar 2003 - 08:10 #2
Avatar billede nop Nybegynder
27. februar 2003 - 09:28 #3
borrisholt> Hvad gør WMNCHitTest eventet, altså logisk.

Ellers en fin rutine, nu har jeg den osse, men det er vel iorden.
Avatar billede borrisholt Novice
27. februar 2003 - 09:31 #4
WMNCHitTest Det er en besked du modtager fra Windows når folk og fæ ? klikker på din form. Så bilder jeg blot Windows in at klikket var inde for Caption ariallet og så flytter formen sig !

Jens B
Avatar billede nop Nybegynder
27. februar 2003 - 09:58 #5
Flytter sig ? Min flytter sig ikke, ligemeget hvor jeg klikker.
OG når jeg lukker ned så kommer der (ligesom i gamle dage!) en msg-box med: "It is now safe to turn off your computer". Det duer egentlig ikke.
DESUDEN så har jeg en eller anden syBase service kørende som holder på systemmet så man skal svare på om man vil afslutte servicen. Det duer egentlig heller ikke.
Så jeg var vist lidt hurtig med rosen (!), men man kan altid lære af din priviligie-kode. Tak.
Avatar billede gamer61 Nybegynder
27. februar 2003 - 14:17 #6
Øhhh det er da sikkert hyggeligt hvad det end er i snakker om men er der ikke nogen som vil være sød enten at maile et eks eller poste koden tak

NY mail brs@email.dk
Avatar billede borrisholt Novice
27. februar 2003 - 14:24 #7
gamer61 >> Download selv koden

nop >>
  wm_NCHitTest. Grunden til formen ikke bevæger sig er fordi
  Jeg har skrevet

procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  Msg.Result := htNowhere;
end;

så kan formen IKKE flyttes. Ønsker du det modsatte resultat at formen skal kunne flyttes uanset hvor du trækker i den skriver do :

  Msg.Result := HTCAPTION;

I stedet for.

slå etv wm_NCHitTest op i hjælpen.

Det andet med Shutdown kigger jeg lige på ..
Avatar billede gamer61 Nybegynder
27. februar 2003 - 14:28 #8
Som der står i mit post; Jeg har set borrisholts shutdown prg men jeg synes ikke at kunne finde det jeg søger. I din dims har du brugt de der runde dimser og der er alt muligt andet kode som jeg ikke vbed om er nødvendig. DERFOR en eller anden please post koden til knappen og hvad der ellers skal til
Avatar billede borrisholt Novice
27. februar 2003 - 14:28 #9
Grunden til den ikke slukker er fordi du ikke har bedt den om det ...

Brug flaget i stedet for.
EWX_POWEROFF
Avatar billede gamer61 Nybegynder
27. februar 2003 - 14:29 #10
Jeg har ikke brugt noget endnu og desuden; flag?
Avatar billede borrisholt Novice
27. februar 2003 - 14:29 #11
function ExitWIndows( iFlags : integer ) : boolean;

  function SetPrivilege( sPrivilegeName : string; bEnabled : boolean ) : boolean;
  var
    TPPrev, TP : TTokenPrivileges;
    Token      : THandle;
    dwRetLen  : DWord;
  begin
    Result := False;
    OpenProcessToken( GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES  or TOKEN_QUERY, Token );
    TP.PrivilegeCount := 1;
    if( LookupPrivilegeValue( Nil, PChar( sPrivilegeName ), TP.Privileges[ 0 ].LUID ) )then
      begin
      if( bEnabled )then
        TP.Privileges[ 0 ].Attributes  :=  SE_PRIVILEGE_ENABLED
      else
        TP.Privileges[ 0 ].Attributes  :=  0;
      dwRetLen := 0;
      Result := AdjustTokenPrivileges( Token, False,TP, SizeOf( TPPrev ), TPPrev, dwRetLen );
    end;
    CloseHandle( Token );
  end;

begin
  Result := True;
  if( SetPrivilege( 'SeShutdownPrivilege', True ) )then
  begin
    if( not ExitWindowsEx( iFlags, 0 ) )then
    begin
      // handle errors...
      Result := False;
    end;
    SetPrivilege( 'SeShutdownPrivilege', False )
  end
  else
  begin
    // handle errors...
    Result := False;
  end;
end;


og kald den :
  ExitWindows(EWX_POWEROFF);

-- Du er ret ny i Delphi ? :-)

Jens B
Avatar billede borrisholt Novice
27. februar 2003 - 14:30 #12
uFlags

Specifies the type of shutdown. This parameter must be some combination of the following values:

Value    Meaning
EWX_FORCE    Forces processes to terminate. When this flag is set, Windows does not send the messages WM_QUERYENDSESSION and WM_ENDSESSION to the applications currently running in the system. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency.
EWX_LOGOFF    Shuts down all processes running in the security context of the process that called the ExitWindowsEx function. Then it logs the user off.
EWX_POWEROFF    Shuts down the system and turns off the power. The system must support the power-off feature.Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section. Windows 95: Security privileges are not supported or required.
EWX_REBOOT    Shuts down the system and then restarts the system. Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section. Windows 95: Security privileges are not supported or required.
EWX_SHUTDOWN    Shuts down the system to a point at which it is safe to turn off the power. All file buffers have been flushed to disk, and all running processes have stopped. Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Remarks section. Windows 95: Security privileges are not supported or required.
Avatar billede gamer61 Nybegynder
27. februar 2003 - 14:33 #13
Man kan trykt sige at jeg er RET ny i delphi. Men hjælpen er på vej. Jeg har bestilt en bog jeg har fået anbefalet ;)
Avatar billede nop Nybegynder
27. februar 2003 - 14:51 #14
Ja nu slukkede den henover syBasen mv. Tak

gamer61>> Du skal bare prøve dig frem, du kunne fx tage borrisholts prg. og prøve at sætte et breakpoint ind der hvor den kalder exitWindows, så du slipper for reboot men også så du kan se hvad de "runde dimser" gør !
tryk <ctrl f2> når break pointene vises så stopper udførslen af dit kørende program. F8/F7 singel-step(F7 følger funcs/procs kaldet), F5/mussetryk til venstre for en source-linje togler break-point.
Avatar billede gamer61 Nybegynder
27. februar 2003 - 14:53 #15
Breakpoints? Øhh der er lidt vej endnu
Avatar billede athlon-pascal Juniormester
27. februar 2003 - 19:12 #16
Følgende funktion er testet (og virker) i både Win98 og Win2k:

function ExitWindowsJB_Hest(iFlags: Integer): Boolean;
var
  osVerInfo: TOSVersionInfo;

  function SetPrivilege(sPrivilegeName: String; bEnabled: Boolean): Boolean;
  var
    TPPrev, TP : TTokenPrivileges;
    Token      : THandle;
    dwRetLen  : DWord;
  begin
    Result := False;
    OpenProcessToken( GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES  or TOKEN_QUERY, Token );
    TP.PrivilegeCount := 1;
    if( LookupPrivilegeValue( Nil, PChar( sPrivilegeName ), TP.Privileges[ 0 ].LUID ) )then
      begin
      if( bEnabled )then
        TP.Privileges[ 0 ].Attributes  :=  SE_PRIVILEGE_ENABLED
      else
        TP.Privileges[ 0 ].Attributes  :=  0;
      dwRetLen := 0;
      Result := AdjustTokenPrivileges( Token, False,TP, SizeOf( TPPrev ), TPPrev, dwRetLen );
    end;
    CloseHandle(Token);
  end;
begin
  Result := True;
  osVerInfo.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
  if GetVersionEx(osVerInfo) then
    case osVerInfo.dwPlatformId of
      VER_PLATFORM_WIN32_WINDOWS:
        if not ExitWindowsEx(iFlags, 0) then
          Result := False; // handle errors...
      VER_PLATFORM_WIN32_NT:
        if SetPrivilege('SeShutdownPrivilege', True) then
        begin
          if not ExitWindowsEx(iFlags, 0) then
            Result:=False; // handle errors...
          SetPrivilege('SeShutdownPrivilege', False)
        end
        else
          Result:=False; // handle errors...
  else
    Result:=false;
  end;                     
end;

Kaldes på følgende måde (i dit tilfælde):

  ExitWindowsJB_Hest(EWX_SHUTDOWN + EWX_FORCE);

eller (kan ikke huske hvilken der lukker helt ned)

  ExitWindowsJB_Hest(EWX_POWEROFF + EWX_FORCE);
Avatar billede athlon-pascal Juniormester
27. februar 2003 - 19:14 #17
Forresten er min funktion en udvidelse af den Jens Borrisholt har skrevet (Derfor ExitWindowsJB), tak Jens :-)
Avatar billede athlon-pascal Juniormester
27. februar 2003 - 19:14 #18
Så hvis du vælger at bruge mit svar, så giv også Jens Borrisholt points :-)
Avatar billede athlon-pascal Juniormester
27. februar 2003 - 19:30 #19
Læser lige at du ønsker koden til knappen, så her er den:

procedure TForm1.Button1Click(Sender: TObject);

  function ExitWindowsJB_Hest(iFlags: Integer): Boolean;
  var
    osVerInfo: TOSVersionInfo;

    function SetPrivilege(sPrivilegeName: String; bEnabled: Boolean): Boolean;
    var
      TPPrev, TP : TTokenPrivileges;
      Token      : THandle;
      dwRetLen  : DWord;
    begin
      Result := False;
      OpenProcessToken( GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES  or TOKEN_QUERY, Token );
      TP.PrivilegeCount := 1;
      if( LookupPrivilegeValue( Nil, PChar( sPrivilegeName ), TP.Privileges[ 0 ].LUID ) )then
      begin
        if( bEnabled )then
          TP.Privileges[ 0 ].Attributes  :=  SE_PRIVILEGE_ENABLED
        else
          TP.Privileges[ 0 ].Attributes  :=  0;
        dwRetLen := 0;
        Result := AdjustTokenPrivileges( Token, False,TP, SizeOf( TPPrev ), TPPrev, dwRetLen );
      end;
      CloseHandle(Token);
    end;
  begin
    Result := True;
    osVerInfo.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
    if GetVersionEx(osVerInfo) then
      case osVerInfo.dwPlatformId of
        VER_PLATFORM_WIN32_WINDOWS:
          if not ExitWindowsEx(iFlags, 0) then
            Result := False; // handle errors...
        VER_PLATFORM_WIN32_NT:
          if SetPrivilege('SeShutdownPrivilege', True) then
          begin
            if not ExitWindowsEx(iFlags, 0) then
              Result:=False; // handle errors...
            SetPrivilege('SeShutdownPrivilege', False)
          end
          else
            Result:=False; // handle errors...
    else
      Result:=false;
    end;                     
  end;

begin
  ExitWindowsJB_Hest(EWX_POWEROFF + EWX_FORCE);
end;
Avatar billede gamer61 Nybegynder
27. februar 2003 - 19:33 #20
Jeg har skrevet følgende under implemantations eller hvad det nu hedder

function ExitWindowsJB_Hest(iFlags: Integer): Boolean;
var
  osVerInfo: TOSVersionInfo;

  function SetPrivilege(sPrivilegeName: String; bEnabled: Boolean): Boolean;
  var
    TPPrev, TP : TTokenPrivileges;
    Token      : THandle;
    dwRetLen  : DWord;
  begin
    Result := False;
    OpenProcessToken( GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES  or TOKEN_QUERY, Token );
    TP.PrivilegeCount := 1;
    if( LookupPrivilegeValue( Nil, PChar( sPrivilegeName ), TP.Privileges[ 0 ].LUID ) )then
      begin
      if( bEnabled )then
        TP.Privileges[ 0 ].Attributes  :=  SE_PRIVILEGE_ENABLED
      else
        TP.Privileges[ 0 ].Attributes  :=  0;
      dwRetLen := 0;
      Result := AdjustTokenPrivileges( Token, False,TP, SizeOf( TPPrev ), TPPrev, dwRetLen );
    end;
    CloseHandle(Token);
  end;
begin
  Result := True;
  osVerInfo.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
  if GetVersionEx(osVerInfo) then
    case osVerInfo.dwPlatformId of
      VER_PLATFORM_WIN32_WINDOWS:
        if not ExitWindowsEx(iFlags, 0) then
          Result := False; // handle errors...
      VER_PLATFORM_WIN32_NT:
        if SetPrivilege('SeShutdownPrivilege', True) then
        begin
          if not ExitWindowsEx(iFlags, 0) then
            Result:=False; // handle errors...
          SetPrivilege('SeShutdownPrivilege', False)
        end
        else
          Result:=False; // handle errors...
  else
    Result:=false;
  end;                     
end;

Og jeg har skrevet følgende under OnClick Eventen

ExitWindowsJB_Hest(EWX_SHUTDOWN + EWX_FORCE);
Avatar billede athlon-pascal Juniormester
27. februar 2003 - 20:04 #21
Brug

ExitWindowsJB_Hest(EWX_POWEROFF + EWX_FORCE);

i stedet for

ExitWindowsJB_Hest(EWX_SHUTDOWN + EWX_FORCE);
Avatar billede gamer61 Nybegynder
27. februar 2003 - 21:54 #22
Ok nu funker det. Tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester