想编一个定时关机的程序,有没有类似的源代码呀?

解决方案 »

  1.   

    网上就有下载的呀,有程序和源代码。这是我下载的。你也可以自己下载的。
    #include <windows.h>
    #include "resource.h"
    #include "ClassXP.h"#pragma warning(disable: 4311)
    #pragma warning(disable: 4312)
    #pragma warning(disable: 4244)#define WM_NOTIFYICON WM_USER+5
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    // 函数声明void WINAPI OnInitDialog();
    void WINAPI OnCommand(WPARAM wParam, LPARAM lParam);
    BOOL CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
    BOOL CALLBACK ShutDown(void);
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    // 全局变量HWND g_hWnd;
    HINSTANCE g_hInstance;
    NOTIFYICONDATA Nid;
    const char c_szAppName[] = "AutoShutDown";
    TCHAR time[4]; // time用来向combo box加入字串
    TCHAR tip[30];
    BOOL Begin = FALSE; // 关机标志,为TRUE是表示开始
    int Hour,Minute;////////////////////////////////////////////////////////////////////////////////////////////////////
    // 程序入口int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)
    { g_hInstance = hInstance;
    ClassXP(NULL, TRUE);
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, (DLGPROC) MainDlgProc);
    ClassXP(NULL, FALSE);
    return 0;}
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    // 主窗口回调函数BOOL CALLBACK MainDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    // 定义一个时间结构用来储存GetLocalTime函数得到的时间
    SYSTEMTIME st;
    TCHAR time[50]; // 静态框中的时间字串 switch (uMsg)
    {
    // 初始化
    case WM_INITDIALOG:
    g_hWnd = hDlg;
    OnInitDialog();
    break; // 处理WM_TIMER
    case WM_TIMER:
    // 获得系统时间
    GetLocalTime(&st);
    // 将时间转换为标准显示格式存储到time数组中
    GetTimeFormat(NULL, TIME_FORCE24HOURFORMAT, &st, "hh':'mm':'ss", time+wsprintf(time, "%d-%d-%d  ", st.wYear, st.wMonth, st.wDay), 50);
    // 显示时间
    SetWindowText(GetDlgItem(g_hWnd, IDC_STATIC2), time);
    // 判断是否关机
    if(Begin&&(Hour==st.wHour)&&(Minute==st.wMinute)){
    Begin = FALSE;
    ShutDown();
    }
    break; case WM_SIZE:
    if (wParam == SIZE_MINIMIZED)
    {
    // 添加系统托盘图标
    Shell_NotifyIcon(NIM_ADD, &Nid);
    ShowWindow(g_hWnd, SW_HIDE);
    }
    break; // 处理系统托盘消息
    case WM_NOTIFYICON:
    if(lParam == WM_LBUTTONUP)
    {
    // 删除系统托盘图标,恢复主窗口
    Shell_NotifyIcon(NIM_DELETE, &Nid);
    ShowWindow(g_hWnd, SW_SHOWNORMAL);
    SetForegroundWindow(g_hWnd);
    }

    if (lParam == WM_RBUTTONDOWN)
    {
    POINT pt;
    HMENU hMenu, hSubMenu;
    // 取得鼠标所在的屏幕位置
    GetCursorPos(&pt);
    // 载入菜单
    hMenu = LoadMenu(g_hInstance, MAKEINTRESOURCE(IDR_MENU1));
    // 设置为右键点击弹出菜单
    hSubMenu = GetSubMenu(hMenu, 0);
    SetForegroundWindow(g_hWnd);
    // 弹出菜单
    TrackPopupMenuEx(hSubMenu, 
    TPM_RIGHTALIGN|TPM_RIGHTBUTTON|TPM_HORPOSANIMATION|TPM_LEFTBUTTON, 
    pt.x, pt.y, g_hWnd, NULL);
    PostMessage(g_hWnd, WM_NULL, 0, 0);
    DestroyMenu(hMenu); }
    break; // 处理COMMAND消息
    case WM_COMMAND:
    OnCommand(wParam, lParam);
    break; // 关闭
    case WM_CLOSE:
    OnCommand(MAKEWPARAM(IDC_EXIT, 0), lParam);
    } return FALSE;
    }////////////////////////////////////////////////////////////////////////////////////////////////////
    // 初始化void WINAPI OnInitDialog()
    {
    int ci;
    HICON hIcon;
    // 设置窗口图标
    hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MAINICON));
    SetClassLong(g_hWnd, GCL_HICON, (LONG) hIcon);
    DeleteObject(hIcon); Nid.cbSize = sizeof(NOTIFYICONDATA);
    Nid.hWnd = g_hWnd;
    Nid.uID = IDC_NOTIFYICON;
    Nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
    Nid.uCallbackMessage = WM_NOTIFYICON;
    Nid.hIcon = (HICON) GetClassLong(g_hWnd, GCL_HICON);
    lstrcpy(Nid.szTip, c_szAppName); // 为程序设定一个计时器, windows 每隔1/2秒向程序发一个WM_TIMER消息
    SetTimer(g_hWnd, ID_TIMER, 500, NULL); // 将24个小时加入到combo box中
    for(ci=0;ci<24;ci++)
    {
    if(ci<=9)
    wsprintf(time, "0%d", ci);
    else
    wsprintf(time, "%d", ci);
    // 向combo box发送CB_ADDSTRING消息加入字串
    SendDlgItemMessage(g_hWnd, IDC_HOUR, CB_ADDSTRING, 0, (LPARAM) time); }
    SendDlgItemMessage(g_hWnd, IDC_HOUR, CB_SETCURSEL, 0, 0); // 将60分钟加入到combo box中
    for(ci=0;ci<60;ci++)
    {
    if(ci<=9)
    wsprintf(time,"0%d", ci);
    else
    wsprintf(time, "%d", ci);
    // 向combo box发送CB_ADDSTRING消息加入字串
    SendDlgItemMessage(g_hWnd, IDC_MINU, CB_ADDSTRING, 0, (LPARAM) time);
    }
    SendDlgItemMessage(g_hWnd, IDC_MINU, CB_SETCURSEL, 0, 0);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    // 命令消息处理void WINAPI OnCommand(WPARAM wParam, LPARAM lParam)
    {
    switch (LOWORD(wParam))
    {
    // 点击对话框中的确定按钮
    case IDC_OK:
    Begin = TRUE;
    wsprintf(tip, "关机时间:%d点%d分", Hour, Minute);
    strcpy(Nid.szTip, tip);
    Shell_NotifyIcon(NIM_ADD, &Nid);
    ShowWindow(g_hWnd, SW_HIDE);
    break;

    // 设置关机时间'几点'
    case IDC_HOUR:
    if(HIWORD(wParam)==LBN_SELCHANGE)
    Hour=SendMessage((HWND)lParam,CB_GETCURSEL,0,0);
    break;

    // 设置关机时间'几分'
    case IDC_MINU:
    if(HIWORD(wParam)==LBN_SELCHANGE)
    Minute=SendMessage((HWND)lParam,CB_GETCURSEL,0,0);
    break; // 停止
    case IDM_STOP:
    Begin = FALSE;
    break; // 点击菜单中的关于
    case IDM_ABOUT:
    MessageBox(g_hWnd, "Code by eym(http://www.eyming.com)\nThanks to: dREAMtHEATER Yonsm", c_szAppName, MB_OK);
    break; // 点击菜单中的退出
    case IDM_EXIT:
    KillTimer(g_hWnd, ID_TIMER);
    Shell_NotifyIcon(NIM_DELETE, &Nid);
    EndDialog(g_hWnd, 0);
    break; // 点击对话框中的退出按钮
    case IDC_EXIT:
    KillTimer(g_hWnd, ID_TIMER);
    EndDialog(g_hWnd, 0);
    }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    // 关机函数
    BOOL CALLBACK ShutDown(void)
    {
        HANDLE hToken;
        TOKEN_PRIVILEGES Tkp;    if (GetVersion() < 0x80000000) // 判断OS  NT
        {
            if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
            {
                LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &Tkp.Privileges[0].Luid);
                Tkp.PrivilegeCount = 1;
                Tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
                AdjustTokenPrivileges(hToken, FALSE, &Tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
                if (GetLastError() == ERROR_SUCCESS) 
                {
                    if (ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
                        return TRUE;
                }
            }
        }
        else if (ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)) // 9x
            return TRUE;    return FALSE;
    }
      

  2.   

    上面程序中关键函数ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)应该改成
    ExitWindowEx(EWX_POWEROFF | EWX_FORCE, 0),否则电脑仅仅关闭Windows而
    不会自动关闭电源。