Voici une procedure permettant de fermer windows, elle fonctionne avec toutes les version de windows (je ne c pas pour NT et 2000, mais normalement oui)
Dans tous les cas, elle a été faite en premier lieu pour marcher avec XP !
Mettre bReboot a TRUE pour redemarrer sinon FALSE pour quitter
Source / Exemple :
procedure FermerWindows(bReboot: boolean);
var sTokenIn,sTokenOut : TTOKENPRIVILEGES ;
dwLen : DWORD ;
hCurrentProcess,hToken : THANDLE ;
Luid1 : TLargeInteger ;
osVer: OSVERSIONINFO;
begin
try
hCurrentProcess := GetCurrentProcess ;
//ajuste les privilèges, c ce ki est necessaire pour windows XP
OpenProcessToken (hCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken);
LookupPrivilegeValue(nil,'SeShutdownPrivilege',Luid1) ;
sTokenIn.PrivilegeCount := 1;
sTokenIn.Privileges[0].Luid := Luid1;
sTokenIn.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,sTokenIn,sizeof(TTOKENPRIVILEGES),sTokenOut,dwLen);
CloseHandle (hToken);
finally
application.ProcessMessages;
//redemarre
if bReboot then ExitWindowsEx(EWX_REBOOT or EWX_FORCEIFHUNG, 0)
else
begin
//arrêt
osVer.dwOSVersionInfoSize := Sizeof(osVer);
GetVersionEx(osVer);
if osVer.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS //test pour la version de windows (9x ou XP)
then ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCEIFHUNG , 0)
else ExitWindowsEx(EWX_POWEROFF or EWX_FORCEIFHUNG , 0);
end;
end;
end;
Conclusion :
J'ai trouvé cette procedure sur les newsgroup, elle me semble vraiment très utile :)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.