当我们点击win10系统搜索框的时候,输入名称 ,win10会帮助我们匹配到对应的应用。这里搜索框实际上就是windows系统的开始菜单。
接下来我们随便找一个应用,右键,然后点击 打开文件位置,我们来看下这个EveryThing的具体位置。
我们会看到搜索框中看到的EveryThing是一个快捷方式,统一存放在系统的开始菜单目录下,
windows系统的开始菜单有两个:一个是全局的开始菜单,位于C:\ProgramData\Microsoft\Windows\Start Menu\Programs
目录下。
另一个是针对每个用户有一个单独的开始菜单,位于C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
目录下。
如果想在搜索框中看到我们自己的应用,可以直接我们自己exe应用的快捷方式复制到系统的开始菜单目录下,就可以在搜索框中搜索到我们自己的应用了。
但是通过手动方式将快捷方式复制到系统开始菜单目录下,只是普通用户的做法,今天这篇文章,我们通过win32 api来演示一下如何创建一个快捷方式。
以下代码基本是从MSDN是复制过来并且做了一部分修改,具体可以参考MSDN的地址:https://learn.microsoft.com/en-us/windows/win32/shell/links
#include <iostream>
#include "windows.h"
#include "winnls.h"
#include "shobjidl.h"
#include "objbase.h"
#include "objidl.h"
#include "shlguid.h"
#include "ShlObj.h"
HRESULT CreateLink(LPCWSTR lpszPathObj, LPCWSTR lpszPathLink, LPCWSTR lpszDesc)
{
CoInitialize(NULL);
HRESULT hres;
IShellLink* psl;
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
if (SUCCEEDED(hres))
{
IPersistFile* ppf;
psl->SetPath(lpszPathObj);
psl->SetDescription(lpszDesc);
hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);
if (SUCCEEDED(hres))
{
hres = ppf->Save(lpszPathLink, TRUE);
ppf->Release();
}
psl->Release();
}
CoUninitialize();
return hres;
}
windows api创建快捷方式是通过COM组件的方式创建的,上述代码声明了一个C++函数CreateLink
,函数中有几个比较重要的Windows Api依次和大家说明一下。
1、CoInitialize(NULL);
初始化COM组件,这是调用COM组件必须要执行的函数。
2、CoCreateInstance
实例化一个具体的COM组件,参数CLSID_ShellLink
可以理解为要实例化的COM组件的唯一Id。
3、QueryInterface
获取到COM组件的接口,这个接口由COM组件提供,不同的COM组件接口不同,但都是调用QueryInterface
函数统一获取到COM组件接口,接口以指针的形式返回,上述代码中返回的接口为IPersistFile* ppf
。
4、ppf->Save
调用COM组件提供的函数,在本示例中,Save函数指的是在指定位置创建一个快捷方式。
5、ppf->Release()
COM组件计数器减1,这个是COM组件调用必须的操作。
6、CoUninitialize()
释放COM组件,和第一个函数CoInitialize(NULL);
必须同时出现。
有了上面这个创建快捷方式的函数,我们来调用一下这个函数。如下代码是为d:\7z2404-x64.exe
这个应用程序创建一个快捷方式。SHGetKnownFolderPath
函数是win32的一个标准函数,用于获取windows系统中各种系统默认的路径,SHGetKnownFolderPath
的第一个参数是个枚举,表示我们要获取的目录类型,也就是你想获取什么目录,是系统的桌面路径、下载路径、图片路径还是什么路径。具体看一参考MSDN的说明:https://learn.microsoft.com/zh-cn/windows/win32/shell/knownfolderid
如下代码中传入的参数FOLDERID_Desktop
表示桌面,也就是说我们会把快捷方式创建在桌面。FOLDERID_CommonPrograms
表示系统的开始菜单目录。
int main()
{
LPCWSTR lpszPathObj = L"d:\\7z2404-x64.exe";//源路径
//设置快捷方式路径
PWSTR path = NULL;
SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, &path);
std::wstring lnkPath(path);
lnkPath.append(L"\\7z2404-x64.lnk");
CreateLink(lpszPathObj, lnkPath.c_str(), L"desc");
}