VC++ 屏幕锁定、关机、托盘工具源代码

VC++ MFC应用程序,实现了屏幕锁定、系统关机和重启、隐藏到系统托盘等功能。程序采用对话框界面,支持开机自启动设置。

一、项目概述

这个小工具提供以下功能:

  1. 锁定计算机屏幕(类似Win+L效果)
  2. 关闭计算机
  3. 重新启动计算机
  4. 注销当前用户
  5. 隐藏到系统托盘
  6. 开机自动启动设置
  7. 屏幕保护程序启动

二、完整源代码

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 核心功能实现

  1. 屏幕锁定

    cpp 复制代码
    void CSysToolsDlg::LockScreen()
    {
        // 锁定工作站
        LockWorkStation();
    }
  2. 关机与重启

    cpp 复制代码
    void 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);
    }
  3. 系统托盘功能

    cpp 复制代码
    void CSysToolsDlg::AddTrayIcon()
    {
        Shell_NotifyIcon(NIM_ADD, &m_trayData);
    }
    
    void CSysToolsDlg::RemoveTrayIcon()
    {
        Shell_NotifyIcon(NIM_DELETE, &m_trayData);
    }
  4. 开机自启动设置

    cpp 复制代码
    void 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 使用说明

  1. 界面操作

    • 点击"锁定屏幕"按钮立即锁定计算机
    • 点击"关闭计算机"按钮关闭计算机
    • 点击"重新启动"按钮重启计算机
    • 点击"注销用户"按钮注销当前用户
    • 点击"屏幕保护"按钮启动屏幕保护程序
    • 点击"隐藏到托盘"按钮最小化程序到系统托盘
    • 点击"退出程序"按钮关闭应用程序
    • 勾选"开机自动启动"使程序随系统启动
  2. 托盘操作

    • 右键点击系统托盘图标显示菜单
    • 选择"显示主窗口"恢复程序界面
    • 选择"锁定计算机"锁定屏幕
    • 选择"关闭计算机"关闭系统
    • 选择"重新启动"重启系统
    • 选择"注销用户"注销当前用户
    • 选择"启动屏幕保护"启动屏保
    • 选择"退出"关闭程序

参考代码 VC++锁定屏幕、关机、隐藏到托盘的小工具源代码 www.youwenfan.com/contentcst/122431.html

四、编译与运行

4.1 环境要求

  • Windows 7/10/11
  • Visual Studio 2010或更高版本
  • MFC库支持

4.2 编译步骤

  1. 创建新的MFC对话框应用程序项目
  2. 添加上述源文件和资源文件
  3. 配置项目属性:
    • 使用Unicode字符集
    • 链接器 → 系统 → 子系统:Windows (/SUBSYSTEM:WINDOWS)
  4. 编译并运行

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对话框界面,具有良好的用户体验和稳定性。

技术亮点

  1. 使用Windows API实现系统级功能
  2. 系统托盘图标和菜单实现
  3. 注册表操作实现开机自启动
  4. 完整的错误处理和用户确认
  5. 简洁直观的用户界面

适用场景

  • 需要快速锁定屏幕的办公环境
  • 需要定时关机的服务器管理
  • 需要隐藏运行的系统工具
  • 需要开机自启动的实用程序
相关推荐
wjs20242 小时前
C++ 字符串
开发语言
蜡台2 小时前
JavaScript Object Function ERROR
开发语言·javascript·ecmascript·error
邪修king2 小时前
【UE4/UE5 萌新向】有C++基础如何快速入门虚幻引擎?超详细图文全揭秘!
c++·ue5·ue4
Shadow(⊙o⊙)2 小时前
C语言学习中需要的额外函数
c语言·开发语言·学习
还是大剑师兰特2 小时前
pinia-plugin-persistedstate详解与Vue3使用示例
开发语言·javascript·ecmascript
Imxyk2 小时前
P9244 [蓝桥杯 2023 省 B] 子串简写
数据结构·c++·算法
艾莉丝努力练剑2 小时前
【Linux线程】Linux系统多线程(四):线程ID及进程地址空间布局,线程封装
java·linux·运维·服务器·c语言·c++·学习
方便面不加香菜2 小时前
C++ 类和对象(二)
开发语言·c++