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.sln | Visual Studio 解决方案文件,双击打开项目 |
| start.cpp | 项目唯一的 C++ 源代码文件 |
| startWindows.exe | 编译后的可执行程序 |
程序主要包含三个工具函数和一个 main 入口:
| 函数 | 功能 |
|---|---|
WideStringToString | 宽字符串 → UTF-8 多字节字符串转换 |
GetAllProcesses | 枚举系统所有运行中的进程 |
TerminateProcessByPID | 根据 PID 强制终止指定进程 |
CreateProcess 启动 Windows Media Player 播放 WAV 音频Sleep(4000) 等待 4 秒TerminateProcess 终止播放器进程#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++
startWindows.sln 用 VS2022 打开生成 → 生成解决方案(或 Ctrl+Shift+B)startWindows\x64\Debug\startWindows.exemsbuild startWindows.sln /p:Configuration=Debug /p:Platform=x64Shell
| 配置 | 平台 | 说明 |
|---|---|---|
| Debug | x64 | 64 位调试版(推荐开发调试) |
| Release | x64 | 64 位发布版(推荐最终使用) |
通过 Windows 任务计划程序来设置开机自动运行:
startWindows.exe如需修改音频文件路径,编辑 start.cpp 中的 audioFilePath 变量:
const wchar_t* audioFilePath = L"你的音频文件路径.wav";C++
修改后重新编译生成 exe 即可。
| 参数 | 默认值 | 说明 |
|---|---|---|
| 音频路径 | D:\Download_X\Windows_start.wav | WAV 格式音频文件 |
| 播放器路径 | C:\Program Files (x86)\Windows Media Player\wmplayer.exe | Windows Media Player |
| 播放时长 | 4000ms | 播放后自动终止播放器 |