求一个自动关机的算法 想编一个定时关机的程序,有没有类似的源代码呀? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 网上就有下载的呀,有程序和源代码。这是我下载的。你也可以自己下载的。#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;} 上面程序中关键函数ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0)应该改成ExitWindowEx(EWX_POWEROFF | EWX_FORCE, 0),否则电脑仅仅关闭Windows而不会自动关闭电源。 读取单个字符,用char,还是用wchar来接受? 如何快速删除文件中的某一块 用odbc连接excel,怎么知道有多少sheet,和sheet的名字? 有人用过AnkhSVN 吗,为什么跟一坨屎似的??? 极菜的鸟请教!!在线! 怎么搞的??欢乐时光怎么杀不掉? 传输一个自定义协议头出现的一些问题 界面显示不对,求指导啊 CreateControl Win32 application 与 win32 console application 有什么区别? 本人是VC的初学者,请各位帮忙把以下的VB语句转为C++的,谢谢 高手帮忙!单文档下的切分窗口和工具栏的通信
#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;
}
ExitWindowEx(EWX_POWEROFF | EWX_FORCE, 0),否则电脑仅仅关闭Windows而
不会自动关闭电源。