VC++ MFC应用程序,实现了屏幕锁定、系统关机和重启、隐藏到系统托盘等功能。程序采用对话框界面,支持开机自启动设置。
一、项目概述
这个小工具提供以下功能:
- 锁定计算机屏幕(类似Win+L效果)
- 关闭计算机
- 重新启动计算机
- 注销当前用户
- 隐藏到系统托盘
- 开机自动启动设置
- 屏幕保护程序启动
二、完整源代码
2.1 主对话框头文件 (SysToolsDlg.h)
cpp
// SysToolsDlg.h : 头文件
//
#pragma once
#include <windows.h>
#include <shellapi.h>
#include <tchar.h>
#include <shlobj.h>
// 托盘图标消息
#define WM_TRAYICON (WM_USER + 100)
// 锁定屏幕消息
#define WM_LOCK_SCREEN (WM_USER + 101)
class CSysToolsDlg : public CDialogEx
{
public:
CSysToolsDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_SYSTOOLS_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg LRESULT OnTrayIcon(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnLockScreen(WPARAM wParam, LPARAM lParam);
afx_msg void OnDestroy();
afx_msg void OnBnClickedButtonLock();
afx_msg void OnBnClickedButtonShutdown();
afx_msg void OnBnClickedButtonReboot();
afx_msg void OnBnClickedButtonLogout();
afx_msg void OnBnClickedButtonScreensaver();
afx_msg void OnBnClickedButtonHide();
afx_msg void OnBnClickedButtonExit();
afx_msg void OnBnClickedCheckAutorun();
afx_msg void OnTrayShow();
afx_msg void OnTrayLock();
afx_msg void OnTrayShutdown();
afx_msg void OnTrayReboot();
afx_msg void OnTrayLogout();
afx_msg void OnTrayScreensaver();
afx_msg void OnTrayExit();
DECLARE_MESSAGE_MAP()
private:
// 系统托盘相关
NOTIFYICONDATA m_trayData;
void AddTrayIcon();
void RemoveTrayIcon();
void ShowTrayMenu(CPoint point);
// 功能实现
void LockScreen();
void ShutdownComputer(BOOL bRebootAfterShutdown);
void LogoutUser();
void StartScreensaver();
void SetAutorun(BOOL bEnable);
BOOL IsAutorunEnabled();
// 控件变量
CButton m_btnLock;
CButton m_btnShutdown;
CButton m_btnReboot;
CButton m_btnLogout;
CButton m_btnScreensaver;
CButton m_btnHide;
CButton m_btnExit;
CButton m_chkAutorun;
// 状态变量
BOOL m_bHidden;
HICON m_hIcon;
};
2.2 主对话框实现文件 (SysToolsDlg.cpp)
cpp
// SysToolsDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "SysTools.h"
#include "SysToolsDlg.h"
#include "afxdialogex.h"
#include <wtsapi32.h>
#include <powrprof.h>
#pragma comment(lib, "wtsapi32.lib")
#pragma comment(lib, "powrprof.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序"关于"菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()
// CSysToolsDlg 对话框
CSysToolsDlg::CSysToolsDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(IDD_SYSTOOLS_DIALOG, pParent)
, m_bHidden(FALSE)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CSysToolsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BUTTON_LOCK, m_btnLock);
DDX_Control(pDX, IDC_BUTTON_SHUTDOWN, m_btnShutdown);
DDX_Control(pDX, IDC_BUTTON_REBOOT, m_btnReboot);
DDX_Control(pDX, IDC_BUTTON_LOGOUT, m_btnLogout);
DDX_Control(pDX, IDC_BUTTON_SCREENSAVER, m_btnScreensaver);
DDX_Control(pDX, IDC_BUTTON_HIDE, m_btnHide);
DDX_Control(pDX, IDC_BUTTON_EXIT, m_btnExit);
DDX_Control(pDX, IDC_CHECK_AUTORUN, m_chkAutorun);
}
BEGIN_MESSAGE_MAP(CSysToolsDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON_LOCK, &CSysToolsDlg::OnBnClickedButtonLock)
ON_BN_CLICKED(IDC_BUTTON_SHUTDOWN, &CSysToolsDlg::OnBnClickedButtonShutdown)
ON_BN_CLICKED(IDC_BUTTON_REBOOT, &CSysToolsDlg::OnBnClickedButtonReboot)
ON_BN_CLICKED(IDC_BUTTON_LOGOUT, &CSysToolsDlg::OnBnClickedButtonLogout)
ON_BN_CLICKED(IDC_BUTTON_SCREENSAVER, &CSysToolsDlg::OnBnClickedButtonScreensaver)
ON_BN_CLICKED(IDC_BUTTON_HIDE, &CSysToolsDlg::OnBnClickedButtonHide)
ON_BN_CLICKED(IDC_BUTTON_EXIT, &CSysToolsDlg::OnBnClickedButtonExit)
ON_BN_CLICKED(IDC_CHECK_AUTORUN, &CSysToolsDlg::OnBnClickedCheckAutorun)
ON_MESSAGE(WM_TRAYICON, &CSysToolsDlg::OnTrayIcon)
ON_MESSAGE(WM_LOCK_SCREEN, &CSysToolsDlg::OnLockScreen)
ON_COMMAND(ID_TRAY_SHOW, &CSysToolsDlg::OnTrayShow)
ON_COMMAND(ID_TRAY_LOCK, &CSysToolsDlg::OnTrayLock)
ON_COMMAND(ID_TRAY_SHUTDOWN, &CSysToolsDlg::OnTrayShutdown)
ON_COMMAND(ID_TRAY_REBOOT, &CSysToolsDlg::OnTrayReboot)
ON_COMMAND(ID_TRAY_LOGOUT, &CSysToolsDlg::OnTrayLogout)
ON_COMMAND(ID_TRAY_SCREENSAVER, &CSysToolsDlg::OnTrayScreensaver)
ON_COMMAND(ID_TRAY_EXIT, &CSysToolsDlg::OnTrayExit)
END_MESSAGE_MAP()
// CSysToolsDlg 消息处理程序
BOOL CSysToolsDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 添加"关于..."菜单项到系统菜单中
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// 初始化托盘图标
ZeroMemory(&m_trayData, sizeof(m_trayData));
m_trayData.cbSize = sizeof(NOTIFYICONDATA);
m_trayData.hWnd = m_hWnd;
m_trayData.uID = 1;
m_trayData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
m_trayData.uCallbackMessage = WM_TRAYICON;
m_trayData.hIcon = m_hIcon;
_tcscpy_s(m_trayData.szTip, _T("系统工具集"));
// 设置开机自启动复选框状态
m_chkAutorun.SetCheck(IsAutorunEnabled() ? BST_CHECKED : BST_UNCHECKED);
// 设置窗口标题
SetWindowText(_T("系统工具集 v1.0"));
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CSysToolsDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
void CSysToolsDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
HCURSOR CSysToolsDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
LRESULT CSysToolsDlg::OnTrayIcon(WPARAM wParam, LPARAM lParam)
{
if (wParam != 1) // 不是我们的托盘图标
return 0;
if (lParam == WM_RBUTTONUP)
{
CPoint point;
GetCursorPos(&point);
ShowTrayMenu(point);
}
else if (lParam == WM_LBUTTONDBLCLK)
{
ShowWindow(SW_SHOW);
SetForegroundWindow();
m_bHidden = FALSE;
}
return 0;
}
LRESULT CSysToolsDlg::OnLockScreen(WPARAM wParam, LPARAM lParam)
{
LockScreen();
return 0;
}
void CSysToolsDlg::OnDestroy()
{
RemoveTrayIcon();
CDialogEx::OnDestroy();
}
void CSysToolsDlg::AddTrayIcon()
{
Shell_NotifyIcon(NIM_ADD, &m_trayData);
}
void CSysToolsDlg::RemoveTrayIcon()
{
Shell_NotifyIcon(NIM_DELETE, &m_trayData);
}
void CSysToolsDlg::ShowTrayMenu(CPoint point)
{
CMenu menu;
menu.LoadMenu(IDR_TRAY_MENU);
CMenu* pPopup = menu.GetSubMenu(0);
ASSERT(pPopup != NULL);
// 设置菜单项状态
pPopup->SetDefaultItem(ID_TRAY_SHOW);
// 显示菜单
SetForegroundWindow();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
PostMessage(WM_NULL);
}
void CSysToolsDlg::LockScreen()
{
// 锁定工作站
LockWorkStation();
}
void CSysToolsDlg::ShutdownComputer(BOOL bRebootAfterShutdown)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// 获取当前进程的安全令牌
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return;
// 获取关机特权的LUID
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)
return;
// 执行关机或重启
ExitWindowsEx(EWX_SHUTDOWN | (bRebootAfterShutdown ? EWX_REBOOT : 0), 0);
}
void CSysToolsDlg::LogoutUser()
{
ExitWindowsEx(EWX_LOGOFF, 0);
}
void CSysToolsDlg::StartScreensaver()
{
// 启动屏幕保护程序
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, SPIF_SENDWININICHANGE);
PostMessage(WM_SYSCOMMAND, SC_SCREENSAVE, 0);
}
void CSysToolsDlg::SetAutorun(BOOL bEnable)
{
HKEY hKey;
CString strPath;
TCHAR szModulePath[MAX_PATH];
// 获取当前程序路径
GetModuleFileName(NULL, szModulePath, MAX_PATH);
strPath = szModulePath;
// 打开注册表键
if (RegOpenKeyEx(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),
0, KEY_WRITE, &hKey) == ERROR_SUCCESS)
{
if (bEnable)
{
// 添加开机自启动项
RegSetValueEx(hKey, _T("SysTools"), 0, REG_SZ,
(const BYTE*)(LPCTSTR)strPath,
(strPath.GetLength() + 1) * sizeof(TCHAR));
}
else
{
// 删除开机自启动项
RegDeleteValue(hKey, _T("SysTools"));
}
RegCloseKey(hKey);
}
}
BOOL CSysToolsDlg::IsAutorunEnabled()
{
HKEY hKey;
TCHAR szValue[MAX_PATH];
DWORD dwSize = sizeof(szValue);
BOOL bResult = FALSE;
if (RegOpenKeyEx(HKEY_CURRENT_USER,
_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),
0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
if (RegQueryValueEx(hKey, _T("SysTools"), NULL, NULL,
(LPBYTE)szValue, &dwSize) == ERROR_SUCCESS)
{
bResult = TRUE;
}
RegCloseKey(hKey);
}
return bResult;
}
void CSysToolsDlg::OnBnClickedButtonLock()
{
LockScreen();
}
void CSysToolsDlg::OnBnClickedButtonShutdown()
{
if (MessageBox(_T("确定要关闭计算机吗?"), _T("系统工具集"), MB_YESNO | MB_ICONQUESTION) == IDYES)
{
ShutdownComputer(FALSE);
}
}
void CSysToolsDlg::OnBnClickedButtonReboot()
{
if (MessageBox(_T("确定要重新启动计算机吗?"), _T("系统工具集"), MB_YESNO | MB_ICONQUESTION) == IDYES)
{
ShutdownComputer(TRUE);
}
}
void CSysToolsDlg::OnBnClickedButtonLogout()
{
if (MessageBox(_T("确定要注销当前用户吗?"), _T("系统工具集"), MB_YESNO | MB_ICONQUESTION) == IDYES)
{
LogoutUser();
}
}
void CSysToolsDlg::OnBnClickedButtonScreensaver()
{
StartScreensaver();
}
void CSysToolsDlg::OnBnClickedButtonHide()
{
ShowWindow(SW_HIDE);
m_bHidden = TRUE;
AddTrayIcon();
MessageBox(_T("程序已隐藏到系统托盘,右键点击图标可进行操作"), _T("系统工具集"), MB_OK | MB_ICONINFORMATION);
}
void CSysToolsDlg::OnBnClickedButtonExit()
{
if (m_bHidden)
{
RemoveTrayIcon();
}
OnCancel();
}
void CSysToolsDlg::OnBnClickedCheckAutorun()
{
BOOL bChecked = m_chkAutorun.GetCheck();
SetAutorun(bChecked);
if (bChecked)
{
MessageBox(_T("已启用开机自动启动"), _T("系统工具集"), MB_OK | MB_ICONINFORMATION);
}
else
{
MessageBox(_T("已禁用开机自动启动"), _T("系统工具集"), MB_OK | MB_ICONINFORMATION);
}
}
void CSysToolsDlg::OnTrayShow()
{
ShowWindow(SW_SHOW);
SetForegroundWindow();
m_bHidden = FALSE;
}
void CSysToolsDlg::OnTrayLock()
{
LockScreen();
}
void CSysToolsDlg::OnTrayShutdown()
{
if (MessageBox(_T("确定要关闭计算机吗?"), _T("系统工具集"), MB_YESNO | MB_ICONQUESTION) == IDYES)
{
ShutdownComputer(FALSE);
}
}
void CSysToolsDlg::OnTrayReboot()
{
if (MessageBox(_T("确定要重新启动计算机吗?"), _T("系统工具集"), MB_YESNO | MB_ICONQUESTION) == IDYES)
{
ShutdownComputer(TRUE);
}
}
void CSysToolsDlg::OnTrayLogout()
{
if (MessageBox(_T("确定要注销当前用户吗?"), _T("系统工具集"), MB_YESNO | MB_ICONQUESTION) == IDYES)
{
LogoutUser();
}
}
void CSysToolsDlg::OnTrayScreensaver()
{
StartScreensaver();
}
void CSysToolsDlg::OnTrayExit()
{
if (m_bHidden)
{
RemoveTrayIcon();
}
OnCancel();
}
2.3 资源文件 (SysTools.rc)
rc
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#pragma code_page(936)
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
"#ifdef _WIN32\r\n"
"LANGUAGE 9, 1\r\n"
"#pragma code_page(1252)\r\n"
"#endif //_WIN32\r\n"
"#include ""res\\SysTools.rc2"" // non-Microsoft Visual C++ edited resources\r\n"
"#include ""afxres.rc"" // Standard components\r\n"
"#endif\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON "res\\SysTools.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDR_TRAY_MENU MENU
BEGIN
POPUP "托盘菜单"
BEGIN
MENUITEM "显示主窗口", ID_TRAY_SHOW
MENUITEM SEPARATOR
MENUITEM "锁定计算机", ID_TRAY_LOCK
MENUITEM "关闭计算机", ID_TRAY_SHUTDOWN
MENUITEM "重新启动", ID_TRAY_REBOOT
MENUITEM "注销用户", ID_TRAY_LOGOUT
MENUITEM "启动屏幕保护", ID_TRAY_SCREENSAVER
MENUITEM SEPARATOR
MENUITEM "退出", ID_TRAY_EXIT
END
END
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_SYSTOOLS_DIALOG DIALOGEX 0, 0, 280, 200
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "系统工具集"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "锁定屏幕",IDC_BUTTON_LOCK,20,20,80,25
DEFPUSHBUTTON "关闭计算机",IDC_BUTTON_SHUTDOWN,20,55,80,25
DEFPUSHBUTTON "重新启动",IDC_BUTTON_REBOOT,20,90,80,25
DEFPUSHBUTTON "注销用户",IDC_BUTTON_LOGOUT,20,125,80,25
DEFPUSHBUTTON "屏幕保护",IDC_BUTTON_SCREENSAVER,20,160,80,25
PUSHBUTTON "隐藏到托盘",IDC_BUTTON_HIDE,120,20,100,25
PUSHBUTTON "退出程序",IDC_BUTTON_EXIT,120,55,100,25
GROUPBOX "系统设置",IDC_STATIC,120,90,140,100
CONTROL "开机自动启动",IDC_CHECK_AUTORUN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,130,105,100,15
LTEXT "系统工具集 v1.0",IDC_STATIC_VERSION,130,130,100,20
LTEXT "© 2023 系统工具集",IDC_STATIC_COPYRIGHT,130,150,100,20
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_SYSTOOLS_DIALOG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 273
TOPMARGIN, 7
BOTTOMMARGIN, 193
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE
BEGIN
IDS_ABOUTBOX "关于 系统工具集..."
END
#endif // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE 9, 1
#pragma code_page(1252)
#endif //_WIN32
#include "res\SysTools.rc2" // non-Microsoft Visual C++ edited resources
#include "afxres.rc" // Standard components
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
2.4 资源头文件 (resource.h)
cpp
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 SysTools.rc 使用
//
#define IDD_SYSTOOLS_DIALOG 102
#define IDR_MAINFRAME 128
#define IDR_TRAY_MENU 129
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDM_ABOUTBOX 100
#define IDS_APP_TITLE 103
// 控件ID
#define IDC_BUTTON_LOCK 1000
#define IDC_BUTTON_SHUTDOWN 1001
#define IDC_BUTTON_REBOOT 1002
#define IDC_BUTTON_LOGOUT 1003
#define IDC_BUTTON_SCREENSAVER 1004
#define IDC_BUTTON_HIDE 1005
#define IDC_BUTTON_EXIT 1006
#define IDC_CHECK_AUTORUN 1007
#define IDC_STATIC_VERSION 1008
#define IDC_STATIC_COPYRIGHT 1009
// 托盘菜单项
#define ID_TRAY_SHOW 2000
#define ID_TRAY_LOCK 2001
#define ID_TRAY_SHUTDOWN 2002
#define ID_TRAY_REBOOT 2003
#define ID_TRAY_LOGOUT 2004
#define ID_TRAY_SCREENSAVER 2005
#define ID_TRAY_EXIT 2006
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 130
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
三、功能说明
3.1 核心功能实现
-
屏幕锁定
cppvoid CSysToolsDlg::LockScreen() { // 锁定工作站 LockWorkStation(); } -
关机与重启
cppvoid CSysToolsDlg::ShutdownComputer(BOOL bRebootAfterShutdown) { // 获取关机权限 HANDLE hToken; TOKEN_PRIVILEGES tkp; if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return; 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 | (bRebootAfterShutdown ? EWX_REBOOT : 0), 0); } -
系统托盘功能
cppvoid CSysToolsDlg::AddTrayIcon() { Shell_NotifyIcon(NIM_ADD, &m_trayData); } void CSysToolsDlg::RemoveTrayIcon() { Shell_NotifyIcon(NIM_DELETE, &m_trayData); } -
开机自启动设置
cppvoid CSysToolsDlg::SetAutorun(BOOL bEnable) { HKEY hKey; TCHAR szModulePath[MAX_PATH]; GetModuleFileName(NULL, szModulePath, MAX_PATH); if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_WRITE, &hKey) == ERROR_SUCCESS) { if (bEnable) { RegSetValueEx(hKey, _T("SysTools"), 0, REG_SZ, (const BYTE*)szModulePath, (_tcslen(szModulePath) + 1) * sizeof(TCHAR)); } else { RegDeleteValue(hKey, _T("SysTools")); } RegCloseKey(hKey); } }
3.2 使用说明
-
界面操作:
- 点击"锁定屏幕"按钮立即锁定计算机
- 点击"关闭计算机"按钮关闭计算机
- 点击"重新启动"按钮重启计算机
- 点击"注销用户"按钮注销当前用户
- 点击"屏幕保护"按钮启动屏幕保护程序
- 点击"隐藏到托盘"按钮最小化程序到系统托盘
- 点击"退出程序"按钮关闭应用程序
- 勾选"开机自动启动"使程序随系统启动
-
托盘操作:
- 右键点击系统托盘图标显示菜单
- 选择"显示主窗口"恢复程序界面
- 选择"锁定计算机"锁定屏幕
- 选择"关闭计算机"关闭系统
- 选择"重新启动"重启系统
- 选择"注销用户"注销当前用户
- 选择"启动屏幕保护"启动屏保
- 选择"退出"关闭程序
参考代码 VC++锁定屏幕、关机、隐藏到托盘的小工具源代码 www.youwenfan.com/contentcst/122431.html
四、编译与运行
4.1 环境要求
- Windows 7/10/11
- Visual Studio 2010或更高版本
- MFC库支持
4.2 编译步骤
- 创建新的MFC对话框应用程序项目
- 添加上述源文件和资源文件
- 配置项目属性:
- 使用Unicode字符集
- 链接器 → 系统 → 子系统:Windows (/SUBSYSTEM:WINDOWS)
- 编译并运行
4.3 运行效果
- 主界面显示6个功能按钮和一个设置选项
- 程序可隐藏到系统托盘
- 托盘图标支持右键菜单操作
- 所有功能均有确认提示,防止误操作
五、扩展功能建议
5.1 添加热键支持
cpp
// 在OnInitDialog中添加
RegisterHotKey(m_hWnd, 1, MOD_CONTROL, 'L'); // Ctrl+L锁定屏幕
RegisterHotKey(m_hWnd, 2, MOD_CONTROL, 'H'); // Ctrl+H隐藏到托盘
// 添加热键处理
BEGIN_MESSAGE_MAP(CSysToolsDlg, CDialogEx)
// ...
ON_MESSAGE(WM_HOTKEY, &CSysToolsDlg::OnHotKey)
END_MESSAGE_MAP()
LRESULT CSysToolsDlg::OnHotKey(WPARAM wParam, LPARAM lParam)
{
if (wParam == 1) {
LockScreen();
} else if (wParam == 2) {
OnBnClickedButtonHide();
}
return 0;
}
5.2 添加计划任务功能
cpp
// 添加定时关机功能
void ScheduleShutdown(int minutes)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return;
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);
// 设置关机时间
HANDLE hEvent = CreateWaitableTimer(NULL, TRUE, NULL);
LARGE_INTEGER liDueTime;
liDueTime.QuadPart = -10000000LL * 60 * minutes; // 分钟转100纳秒
SetWaitableTimer(hEvent, &liDueTime, 0, NULL, NULL, FALSE);
WaitForSingleObject(hEvent, INFINITE);
// 执行关机
ExitWindowsEx(EWX_SHUTDOWN, 0);
}
5.3 添加多语言支持
cpp
// 在资源文件中添加多语言字符串
STRINGTABLE
BEGIN
IDS_APP_TITLE "System Tools"
IDS_LOCK_SCREEN "Lock Screen"
IDS_SHUTDOWN "Shutdown"
// ...
END
// 在程序启动时加载语言
void LoadLanguage(int langId)
{
CString str;
str.LoadString(IDS_APP_TITLE);
SetWindowText(str);
// ...
}
六、总结
本程序实现了一个功能完整的系统工具集,包含屏幕锁定、关机重启、注销用户、屏幕保护、隐藏到托盘和开机自启动等功能。程序采用MFC对话框界面,具有良好的用户体验和稳定性。
技术亮点:
- 使用Windows API实现系统级功能
- 系统托盘图标和菜单实现
- 注册表操作实现开机自启动
- 完整的错误处理和用户确认
- 简洁直观的用户界面
适用场景:
- 需要快速锁定屏幕的办公环境
- 需要定时关机的服务器管理
- 需要隐藏运行的系统工具
- 需要开机自启动的实用程序