在被加入启动的程序中调用EXITWINDOW()关机为何不好使?(100分)

  • 主题发起人 主题发起人 potato
  • 开始时间 开始时间
P

potato

Unregistered / Unconfirmed
GUEST, unregistred user!
我经过修改注册表把程序添加到启动中,调用EXITWINDOWS(EXW_SHUTDOWN,0)
编译通过,但是执行时,总是重新登录,而不是关机,望各位高手指点。
 
你只需简单地使用以下代码:
;
; function GetWinVersion: String;
; var
; ; ;VersionInfo : TOSVersionInfo;
; ; ;OSName ; ; ;: String;
; begin
; ; ;// set the size of the record
; ; ;VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
;
; ; ;if Windows.GetVersionEx( VersionInfo ) then
; ; ; ; begin
; ; ; ; ; ;with VersionInfo do
; ; ; ; ; ;begin
; ; ; ; ; ; ; case dwPlatformId of
; ; ; ; ; ; ; ; ;VER_PLATFORM_WIN32s ; : OSName := 'Win32s';
; ; ; ; ; ; ; ; ;VER_PLATFORM_WIN32_WINDOWS : OSName := 'Windows 95';
; ; ; ; ; ; ; ; ;VER_PLATFORM_WIN32_NT ; ; ;: OSName := 'Windows NT';
; ; ; ; ; ; ; end; // case dwPlatformId
; ; ; ; ; ; ; Result := OSName + ' Version ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) +
; ; ; ; ; ; ; ; ; ; ; ; #13#10' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';
; ; ; ; ; ;end; // with VersionInfo
; ; ; ; end // if GetVersionEx
; ; ;else
; ; ; ; Result := '';
; end;
;
; procedure ShutDown;
; const
; ; SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; ; // Borland forgot this declaration
; var
; ; hToken ; ; ; : THandle;
; ; tkp ; ; ; ; ;: TTokenPrivileges;
; ; tkpo ; ; ; ; : TTokenPrivileges;
; ; zero ; ; ; ; : DWORD;
; begin
; ; if Pos( 'Windows NT', GetWinVersion) = 1 ;then // we've got to do a whole buch of things
; ; ; ;begin
; ; ; ; ; zero := 0;
; ; ; ; ; if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
; ; ; ; ; ; ;begin
; ; ; ; ; ; ; ;MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );
; ; ; ; ; ; ; ;Exit;
; ; ; ; ; ; ;end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
; ; ; ; ; if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
; ; ; ; ; ; ;begin
; ; ; ; ; ; ; ;MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );
; ; ; ; ; ; ; ;Exit;
; ; ; ; ; ; ;end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)
;
;
; ; ; ; ; // SE_SHUTDOWN_NAME
; ; ; ; ; if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then
; ; ; ; ; ; ;begin
; ; ; ; ; ; ; ; MessageBox( 0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK );
; ; ; ; ; ; ; ; Exit;
; ; ; ; ; ; ;end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )
; ; ; ; ; tkp.PrivilegeCount := 1;
; ; ; ; ; tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;
;
; ; ; ; ; AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );
; ; ; ; ; if Boolean( GetLastError() ) then
; ; ; ; ; ; ;begin
; ; ; ; ; ; ; ; MessageBox( 0, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK );
; ; ; ; ; ; ; ; Exit;
; ; ; ; ; ; ;end // if Boolean( GetLastError() )
; ; ; ; ; else
; ; ; ; ; ; ;ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
; ; ; ; end // if OSVersion = 'Windows NT'
; ; ;else
; ; ; ; begin // just shut the machine down
; ; ; ; ; ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
; ; ; ; end; // else
; end;
 
请问你自己关WINDOWS时是要按电源才能最终关闭电脑还是自动关闭?若还是要你手动关闭,
则会出现重启动现象,这便要检查你的电脑是否支持自动关机,若支持就看看你的CMOS中有没
有设好;若是自动关闭,则再看看你的源码有没有问题.
 
你只用exx_shutdown试试!
还有你取得windows2000的关机权限了吗!?
 
后退
顶部