65.9K
CodeProject 正在变化。 阅读更多。
Home

一个执行自动关机、注销或重启操作的工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (11投票s)

2004年12月18日

2分钟阅读

viewsIcon

92657

downloadIcon

2911

这是一个简单的工具,用于在指定时间自动关机、注销或重启您的计算机。该工具在最小化后将在系统托盘中运行。

Sample Image - StayON.jpg

引言

这是一个简单的工具,用于在指定时间自动关机、注销或重启您的计算机。当您希望在一段时间后注销、关闭或重启计算机,而您又不在计算机旁时,它非常有用,例如,您希望在完成下载或磁盘碎片整理后 3 或 4 小时后关机。为此,选择“在此计算机关闭后”单选按钮,并在编辑框中指定 240 分钟,然后单击“应用”。

该工具还通过简化的代码教授托盘图标操作背后的技术。

详细信息

应用(“应用”)后将启动两个计时器。一个计时器将显示闪烁的图标,另一个计时器将检查时间并执行操作。该操作可以是以下任何一项。

  • 关机
  • 注销
  • 重启

下面的代码是执行操作的代码。要执行这些操作,登录用户必须具有 TOKEN_ADJUST_PRIVILEGESTOKEN_QUERY 权限。否则,这将失败。

void CStayONDlg::OnAction()
{
    HANDLE hToken; 
    TOKEN_PRIVILEGES tkp; 
 
    if (OpenProcessToken(    GetCurrentProcess(),
                TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, 
                & hToken)) 
    {// open and check the privileges for to perform the actions

        LookupPrivilegeValue(    NULL, 
                    SE_SHUTDOWN_NAME, 
                    & tkp.Privileges[0].Luid); 
         
        tkp.PrivilegeCount = 1; 
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

        if(AdjustTokenPrivileges(    hToken, 
                        FALSE, 
                        & tkp, 
                        0, 
                        (PTOKEN_PRIVILEGES)NULL, 
                        0))
        {/// adjust the privilege to perform the action
            if(m_dwAction & STAT_SWOFF)
                ExitWindowsEx(    EWX_SHUTDOWN|
                        EWX_POWEROFF|
                        EWX_FORCE,
                        0);
            else if(m_dwAction & STAT_SWOFFTIMER)
                ExitWindowsEx(    EWX_SHUTDOWN|
                        EWX_POWEROFF|
                        EWX_FORCE,
                        0);
            else if(m_dwAction & STAT_LOGOFF)
                ExitWindowsEx(    EWX_LOGOFF|
                        EWX_FORCE,
                        0);
            else if(m_dwAction & STAT_LOGOFFTIMER)
                ExitWindowsEx(    EWX_LOGOFF|
                        EWX_FORCE,
                        0);
            else if(m_dwAction & STAT_RESTART)
                ExitWindowsEx(    EWX_REBOOT|
                        EWX_FORCE,
                        0);
            else if(m_dwAction & STAT_RESTARTTIMER)
                ExitWindowsEx(    EWX_REBOOT|
                        EWX_FORCE,
                        0);
        }
    }

    int err = GetLastError();
    if(err)
    {// if any error occurs the report to the user
        LPVOID lpMsgBuf;
        FormatMessage(    FORMAT_MESSAGE_ALLOCATE_BUFFER|
                FORMAT_MESSAGE_FROM_SYSTEM, 
                NULL,
                err, 
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR) & lpMsgBuf, 
                0, 
                NULL);
        MessageBox(    (LPTSTR)lpMsgBuf, 
                "StayON", 
                MB_OK|MB_ICONERROR);
        LocalFree(lpMsgBuf);
    }
    
    // make sure you quit after issueing any commands
    PostQuitMessage(0);
    exit(0);
}

EWX_FORCE 标志将忽略任何正在运行的进程。如果删除此标志,关机、注销或重启操作将等待其他进程完成。例如,如果在 MS-Word 中打开了未保存的文档,则关机、注销或重启操作将等待 MS-Word 关闭。即,它将等待用户单击 MS-Word 文档上的“保存”。有关更多详细信息,请参阅 MSDN 中的 ExitWindowsEx

结论

希望这个工具对某些人有用。我想提醒您,我对该工具造成的任何损害概不负责。谢谢。

警告:此工具无法检测计算机上正在进行的任何进程。它将无论任何进程正在运行都执行关机、注销或重启操作。因此,请谨慎预测关机、重启或注销的时间。

© . All rights reserved.