小知识: 快捷方式其实也是有后缀的,后缀为.lnk。
注释:
- lnk文件一般是看不到的,反正我不用代码的话,无论如何也是不行;如果大家有办法靠window上的简单配置就可以看到的话,欢迎留言,我也学习下。
- 具体的请好好阅读代码中的注释,因为下面我只简单写了步骤。
第一步
根据目录 找出全部的lnk文件(快捷方式)。
// 传入参数:计算机的目录(一般是开始启动C:\ProgramData\Microsoft\Windows\Start Menu\Programs
// 异或是任意目录C:\Users\...\Desktop)
// 返回参数:找到的所有lnk地址。
QStringList GetFileList(const QString &path)
{
QDir dir(path);
QFileInfoList file_folder = dir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot );
QStringList files;
for(int i = 0; i != file_folder.size(); i++)
{
QString name = file_folder[i].absoluteFilePath();
if(name.endsWith("lnk", Qt::CaseInsensitive)) {
files.append(file_folder[i].absoluteFilePath());
} else if(file_folder[i].isDir()) {
files.append(GetFileList(name));
}
}
return files;
}
<使用方法>
#define StartMenu "C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs"
QStringList list = GetFileList(StartMenu);
第二步
读取lnk文件,找到exe文件
// 传入参数:快捷方式中的字段,越详细越好,如果带有.lnk就不会跟文件夹冲突了
// 或者自己再改改代码,是文件夹的话,字符串中该文件夹的后面肯定是带有\\或者/的。
// Example:我安装了VS。所以开始启动目录里就有
// C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019\Visual Studio Tools\Developer PowerShell for VS 2019.lnk
// 和 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019.lnk
// 如果参数想凭借"Visual Studio 20"来找到Visual Studio 2019.lnk的exe,Developer PowerShell for VS 2019.lnk的根文件夹的名字就会有冲突。所以如果想找到Visual Studio 2019.lnk的exe,用我的方法就必须传入全称(也就是Visual Studio 2019.lnk)
QString Editor::get(QString name)
{
foreach(QString str, list) {
// Qt::CaseInsensitive不区分大小写、Qt::CaseSensitive区分大小写
if(str.contains(name, Qt::CaseInsensitive)) {
QFile::remove("./temp.dat");
QFile::copy(str, "./temp.dat");
QFile file("./temp.dat");
if(file.open(QIODevice::ReadOnly))
{
char arr[1000] = { 0 };
QDataStream data(&file);
data.readRawData(arr, 1000);
QString temp;
for(int i = 0; i < 1000; ++i)
{
temp += arr[i];
}
int index_start = 0, index_end = 0;
while(index_start != -1 && index_end != -1) {
index_start = temp.indexOf(":\\", index_start);
index_end = temp.indexOf(".exe", index_start);
QString file_name = temp.mid(index_start-1, index_end-index_start+5);
QFileInfo info(file_name);
if(info.isFile()) return file_name;
else {
index_start += 2;
index_end += 4;
}
}
}
}
}
return QString();
}
<使用方法>
get("sublime");
get("Vrisual Studio 2019.lnk");
get("Vrisual Studio Code.lnk");
get("notepad++");