请问如何实现:单击一个按纽,实现关机,重启,注销??
都需要那些函数??

解决方案 »

  1.   

    BOOL ExitWindowsEx(
      UINT uFlags,       // shutdown operation
      DWORD dwReserved   // reserved
    );BOOL ExitWindows(
      DWORD dwReserved,  // reserved; must be zero
      UINT uReserved     // reserved; must be zero
    );
      

  2.   

    ExitWindowsEx
    可以注销,关机,重启,具体查MSDN吧。
      

  3.   


    void Shutdown9x()
    {
    switch (shutdown)
    {
    case 0:
    ExitWindowsEx(EWX_SHUTDOWN, 0L);
    break;
    case 1:
    ExitWindowsEx(EWX_REBOOT, 0L);
    break;
    default:
    WinExec("Exit To Dos.pif", SW_SHOWNORMAL);
    break;
    }
    }
    BOOL ShutdownNT()
    {
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 
     
    if (!OpenProcessToken(GetCurrentProcess(), 
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return FALSE;
     
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, 
            &tkp.Privileges[0].Luid); 
     
    tkp.PrivilegeCount = 1;  // one privilege to set    
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
     
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
            (PTOKEN_PRIVILEGES)NULL, 0); 
     
    if (GetLastError() != ERROR_SUCCESS) return FALSE;   
     
    if (shutdown == TRUE)
    ExitWindowsEx(EWX_SHUTDOWN, 0L);
    else ExitWindowsEx(EWX_REBOOT, 0L);
    return TRUE;
    }其实都是用ExitWindowsEx()退出的
    shutdown表示是退出还是重起
    2k下要做都一些安全性的东西
    只是
    //判断系统类型
    BOOL IsWindowsNT()
    {
    BOOL bRet = FALSE;
    BOOL bOsVersionInfoEx;
    OSVERSIONINFOEX osvi; // Try calling GetVersionEx using the OSVERSIONINFOEX structure,
    // If that fails, try using the OSVERSIONINFO structure.
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
    {
    // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
    osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
    if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
    return bRet;
    } if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion <= 4)
    {
    bRet = TRUE;
    } return bRet;
    }BOOL IsWindows2k()
    {
    BOOL bRet = FALSE;
    BOOL bOsVersionInfoEx;
    OSVERSIONINFOEX osvi; // Try calling GetVersionEx using the OSVERSIONINFOEX structure,
    // If that fails, try using the OSVERSIONINFO structure.
    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
    {
    // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
    osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
    if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) 
    return bRet;
    } if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= 5)
    {
    bRet = TRUE;
    } return bRet;
    }
      

  4.   

    这代码是我用在别的地方的
    你不行就不要写这么多了
    就直接
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 
     
    if (!OpenProcessToken(GetCurrentProcess(), 
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return FALSE;
     
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, 
            &tkp.Privileges[0].Luid); 
     
    tkp.PrivilegeCount = 1;  // one privilege to set    
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
     
    AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
            (PTOKEN_PRIVILEGES)NULL, 0); 
     
    if (GetLastError() != ERROR_SUCCESS) return FALSE;   
     //不考虑重起的情况了
    ExitWindowsEx(EWX_SHUTDOWN, 0L);
    return TRUE;
      

  5.   

    完全同意 akiy(winexec) 。以前我也遇到过这样的问题。 2k和xp要取得权限才能重启和关机