关于自动关机的程序设计(MFC/VC)


自动关机,对于某些时候有一定的实用性。运用API实现这一功能其实很简单,再结合托盘显示、托盘鼠标响应、动态菜单等,编制出一个简单的自动关机的程序!
1、自动关机的APi函数
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
DWORD dwVersion;

dwVersion = GetVersion();  // 得到WINDOWS NT或Win32的版本号

if(dwVersion < 0x80000000)  // 用于判断WIN系列,从而设置相应的权限
{
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);
ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0);
}
else
{
ExitWindowsEx(EWX_FORCE | EWX_SHUTDOWN, 0);
}
=============================
通过ExitWindowsEx()函数还可实现重启、注销,参见MSDN。

2、关闭计算机线程控制
通过代码
CTime time = CTime::GetCurrentTime();
int nSystemHour = time.GetHour();
int nSystemMinute = time.GetMinute();
获取系统当前时间,并判断是否等于设置关机时间。

3、最小化后隐藏主窗口
::ShowWindow(SW_HIDE); // 隐藏主窗口

4、添加系统托盘
NOTIFYICONDATA pnid;
pnid.cbSize = (DWORD)sizeof(NOTIFYICONDATA); // 该结构体大小
pnid.hWnd = m_hWnd;  // 窗口句柄
pnid.uID  = (UINT)m_hIcon;  // 图标句柄
// 图标有效|自定义消息有效|鼠标指向显示文字有效
pnid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ; 

pnid.uCallbackMessage = WM_MY_NOTIFYICON;//自定义的消息名称
HICON hIcon;
hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
pnid.hIcon = hIcon;  // 图标句柄
strcpy(pnid.szTip, "自动关机"); // 鼠标指到那所显示的文字
::Shell_NotifyIcon(NIM_ADD, &pnid); // 在托盘区添加图标
(  ::Shell_NotifyIcon(NIM_DELETE, &pnid); // 删除托盘图标 )

5、增加托盘菜单,并响应鼠标时事件
CPoint point;
GetCursorPos(&point);
CMenu menu;
menu.LoadMenu(IDR_MOUSE_MENU);
CMenu* pPopup = menu.GetSubMenu(0);
SetForegroundWindow();  //It's me added
//PostMessage(WM_SYSCOMMAND, WM_NULL, 0);
pPopup->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y,
AfxGetMainWnd(), NULL);

6、获取系统运行总时间
CString strTime;
strTime.Format("Windows已运行了%d小时%d分钟",
::GetTickCount()/1000/60/60,
::GetTickCount()/1000/60%60);
AfxMessageBox(strTime);

运用以上的代码片断,即可实现简单的自动关机程序!试试吧!

你可能感兴趣的:(关于自动关机的程序设计(MFC/VC))