在阅读源码(TaskmgrPlayer.cpp)时发现以下几个问题,提交此 Issue 供作者参考。
Bug 1:FindVideo 会漏掉第一个匹配文件
FindFirstFileA 返回的第一个文件没有被处理,直接调用了 FindNextFileA,导致目录中第一个符合条件的视频文件会被跳过。
原代码:
HANDLE hFile = FindFirstFileA(".", &wfd);
for (; hFile != INVALID_HANDLE_VALUE;)
{
FindNextFileA(hFile, &wfd); // 第一次循环就跳过了 wfd 中已有的第一个文件
// ...
}
建议修复:
HANDLE hFile = FindFirstFileA(".", &wfd);
while (hFile != INVALID_HANDLE_VALUE)
{
string fileName = wfd.cFileName;
string type = fileName.substr(fileName.find_last_of('.') + 1);
if (type == "flv" || type == "mp4" || type == "avi") {
FindClose(hFile);
return fileName;
}
if (!FindNextFileA(hFile, &wfd)) break;
}
if (hFile != INVALID_HANDLE_VALUE) FindClose(hFile);
return "";
Bug 2:WndClassName 比较的是指针地址而非字符串内容
EnumChildWindowsProc 中使用了 == 比较两个 wchar_t*,实际比较的是指针地址,永远无法正确匹配类名,可能导致无法找到正确的子窗口。
原代码:
if (WndClassName == ClassNameToEnum && ...) // 指针比较,逻辑错误
建议修复:
if (wcscmp(WndClassName, ClassNameToEnum.c_str()) == 0 && ...)
Bug 3:system("rm audio.wav") 在 Windows 下无效
rm 是 Linux/macOS 命令,Windows 下应使用 del 或 _wremove。
原代码:
system("rm audio.wav"); // Windows 下不会生效
建议修复:
_wremove(L"audio.wav");
// 或
system("del audio.wav");
环境信息
OS:Windows
编译器:MSVC(Visual Studio)
涉及文件:TaskmgrPlayer/TaskmgrPlayer.cpp
复现步骤
将视频文件放在程序目录下,确保它是目录中第一个被枚举到的文件,视频无法被检测到
配置 ChildClassName 为非空值,子窗口无法被正确匹配
播放结束后检查目录,audio.wav 未被删除
以上问题均已在本地验证,修复后程序可正常运行。欢迎作者确认并合并修复。
在阅读源码(TaskmgrPlayer.cpp)时发现以下几个问题,提交此 Issue 供作者参考。
Bug 1:FindVideo 会漏掉第一个匹配文件
FindFirstFileA 返回的第一个文件没有被处理,直接调用了 FindNextFileA,导致目录中第一个符合条件的视频文件会被跳过。
原代码:
HANDLE hFile = FindFirstFileA(".", &wfd);
for (; hFile != INVALID_HANDLE_VALUE;)
{
FindNextFileA(hFile, &wfd); // 第一次循环就跳过了 wfd 中已有的第一个文件
// ...
}
建议修复:
HANDLE hFile = FindFirstFileA(".", &wfd);
while (hFile != INVALID_HANDLE_VALUE)
{
string fileName = wfd.cFileName;
string type = fileName.substr(fileName.find_last_of('.') + 1);
if (type == "flv" || type == "mp4" || type == "avi") {
FindClose(hFile);
return fileName;
}
if (!FindNextFileA(hFile, &wfd)) break;
}
if (hFile != INVALID_HANDLE_VALUE) FindClose(hFile);
return "";
Bug 2:WndClassName 比较的是指针地址而非字符串内容
EnumChildWindowsProc 中使用了 == 比较两个 wchar_t*,实际比较的是指针地址,永远无法正确匹配类名,可能导致无法找到正确的子窗口。
原代码:
if (WndClassName == ClassNameToEnum && ...) // 指针比较,逻辑错误
建议修复:
if (wcscmp(WndClassName, ClassNameToEnum.c_str()) == 0 && ...)
Bug 3:system("rm audio.wav") 在 Windows 下无效
rm 是 Linux/macOS 命令,Windows 下应使用 del 或 _wremove。
原代码:
system("rm audio.wav"); // Windows 下不会生效
建议修复:
_wremove(L"audio.wav");
// 或
system("del audio.wav");
环境信息
OS:Windows
编译器:MSVC(Visual Studio)
涉及文件:TaskmgrPlayer/TaskmgrPlayer.cpp
复现步骤
将视频文件放在程序目录下,确保它是目录中第一个被枚举到的文件,视频无法被检测到
配置 ChildClassName 为非空值,子窗口无法被正确匹配
播放结束后检查目录,audio.wav 未被删除
以上问题均已在本地验证,修复后程序可正常运行。欢迎作者确认并合并修复。