用EXITWINDOWSEX()函数,参数为>?,查一下MSDN就知道了,不过WIN2000是基于NT技术的,所以在调用此函数之前要先获得相应权限,具体的内容在MSDN中可以查到.

解决方案 »

  1.   

      不好意思,刚才没说玩,如果要实现自动关机,最好把你的程序加在启动项目里,可以修改注册表来达到这个目的.还有,你的程序要能够配置,程序图标放在右下角SYSTEMTBAR为佳,可以在程序初始化时调用SetWindowLong(Form1.Handle, Ex_Tool_Window)来实现,参数可能不对,都忘了,看看HELP就知道了..
      

  2.   


    procedure TtvAPIThing.ShutDown;
    const
    SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this declaration
    var
    hToken : THandle;
    tkp : TTokenPrivileges;
    tkpo : TTokenPrivileges;
    zero : DWORD;
    begin
    if Pos( 'Windows NT', OSVersion ) = 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; 
      

  3.   


    procedure TtvAPIThing.ShutDown;
    const
    SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this declaration
    var
    hToken : THandle;
    tkp : TTokenPrivileges;
    tkpo : TTokenPrivileges;
    zero : DWORD;
    begin
    if Pos( 'Windows NT', OSVersion ) = 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;