一、项目概述

startWindows 是一个轻量级的 Windows 控制台应用程序,主要功能是在系统开机时自动播放一段启动音乐(WAV 格式),播放完毕后自动清理所有进程,不留任何后台残留。

开发环境:Visual Studio 2022 (v143) + Windows 10/11
编程语言:C++ (Windows 控制台应用程序)
源码托管:gitee.com/hueimelly/soundciallo
• • •

二、工程结构

项目采用 Visual Studio 2022 解决方案结构,仅包含一个源文件,结构简洁:

startWindows/
├── startWindows.sln              # 解决方案文件
├── startWindows.vcxproj          # 项目文件
├── start.cpp                     # 唯一源代码(主程序入口)
└── x64/Debug/
    └── startWindows.exe          # 编译生成的可执行文件Text
文件说明
startWindows.slnVisual Studio 解决方案文件,双击打开项目
start.cpp项目唯一的 C++ 源代码文件
startWindows.exe编译后的可执行程序
• • •

三、核心代码

程序主要包含三个工具函数和一个 main 入口:

3.1 函数说明

函数功能
WideStringToString宽字符串 → UTF-8 多字节字符串转换
GetAllProcesses枚举系统所有运行中的进程
TerminateProcessByPID根据 PID 强制终止指定进程

3.2 主流程

  1. 通过 CreateProcess 启动 Windows Media Player 播放 WAV 音频
  2. Sleep(4000) 等待 4 秒
  3. TerminateProcess 终止播放器进程
  4. 枚举所有进程,查找并终止自身的全部实例

3.3 完整源代码

#include <iostream>
#include <windows.h>
#include <string>
#include <tlhelp32.h>
#include <vector>

// 将 wstring 转换为 string
std::string WideStringToString(const std::wstring& wstr) {
    int size_needed = WideCharToMultiByte(
        CP_UTF8, 0, &wstr[0], static_cast<int>(wstr.size()),
        nullptr, 0, nullptr, nullptr
    );
    std::string strTo(size_needed, 0);
    WideCharToMultiByte(
        CP_UTF8, 0, &wstr[0], static_cast<int>(wstr.size()),
        &strTo[0], size_needed, nullptr, nullptr
    );
    return strTo;
}

// 获取所有进程的信息
std::vector<PROCESSENTRY32> GetAllProcesses() {
    std::vector<PROCESSENTRY32> processes;
    PROCESSENTRY32 processInfo;
    processInfo.dwSize = sizeof(processInfo);

    HANDLE processesSnapshot =
        CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (processesSnapshot == INVALID_HANDLE_VALUE)
        return processes;

    Process32First(processesSnapshot, &processInfo);
    do {
        processes.push_back(processInfo);
    } while (Process32Next(processesSnapshot, &processInfo));

    CloseHandle(processesSnapshot);
    return processes;
}

// 结束指定进程
bool TerminateProcessByPID(DWORD pid) {
    HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
    if (hProcess == NULL) {
        std::cerr << "Failed to open process. Error: "
                  << GetLastError() << std::endl;
        return false;
    }
    if (!TerminateProcess(hProcess, 0)) {
        std::cerr << "Failed to terminate process. Error: "
                  << GetLastError() << std::endl;
        CloseHandle(hProcess);
        return false;
    }
    CloseHandle(hProcess);
    return true;
}

int main() {
    // 设置要播放的音频文件路径
    const wchar_t* audioFilePath =
        L"D:\\Download_X\\Windows_start.wav";

    // 设置 Windows Media Player 可执行文件路径
    const wchar_t* mediaPlayerPath =
        L"C:\\Program Files (x86)\\Windows Media Player\\wmplayer.exe";

    // 构建命令字符串
    std::wstring command = mediaPlayerPath;
    command += L" ";
    command += audioFilePath;

    // 创建进程
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    if (!CreateProcess(NULL, const_cast<LPWSTR>(command.c_str()),
            NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
        std::cerr << "Failed to create process. Error: "
                  << GetLastError() << std::endl;
        return 1;
    }

    // 等待 4 秒
    Sleep(4000);

    // 结束播放器进程
    TerminateProcess(pi.hProcess, 0);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);

    // 查找并结束本程序的所有实例
    std::vector<PROCESSENTRY32> processes = GetAllProcesses();
    for (const auto& process : processes) {
        if (std::wstring(process.szExeFile) == L"startWindows.exe") {
            TerminateProcessByPID(process.th32ProcessID);
        }
    }

    return 0;
}C++
• • •

四、编译与构建

方式一:Visual Studio IDE

  1. 双击 startWindows.sln 用 VS2022 打开
  2. 工具栏选择配置 Debug / x64
  3. 生成 → 生成解决方案(或 Ctrl+Shift+B
  4. 编译产物:startWindows\x64\Debug\startWindows.exe

方式二:命令行(MSBuild)

msbuild startWindows.sln /p:Configuration=Debug /p:Platform=x64Shell
配置平台说明
Debugx6464 位调试版(推荐开发调试)
Releasex6464 位发布版(推荐最终使用)
• • •

五、开机自启配置

通过 Windows 任务计划程序来设置开机自动运行:

  1. 打开 计算机管理任务计划程序任务计划程序库
  2. 点击右侧 创建任务...
  3. 常规 标签:
  4. 触发器 标签:新建 → 开始任务:启动时
  5. 操作 标签:新建 → 操作:启动程序 → 选择编译好的 startWindows.exe
  6. 点击确定保存任务
⚠️ 提示:设置完成后可手动运行一次任务测试效果。重启电脑即可听到开机音效。如果没声音,检查音频文件路径是否正确、WAV 格式是否有效。
• • •

六、自定义配置

如需修改音频文件路径,编辑 start.cpp 中的 audioFilePath 变量:

const wchar_t* audioFilePath = L"你的音频文件路径.wav";C++

修改后重新编译生成 exe 即可。

参数默认值说明
音频路径D:\Download_X\Windows_start.wavWAV 格式音频文件
播放器路径C:\Program Files (x86)\Windows Media Player\wmplayer.exeWindows Media Player
播放时长4000ms播放后自动终止播放器
• • •

七、参考资料