當(dāng)我們點(diǎn)擊win10系統(tǒng)搜索框的時(shí)候,輸入名稱(chēng) ,win10會(huì)幫助我們匹配到對(duì)應(yīng)的應(yīng)用。這里搜索框?qū)嶋H上就是windows系統(tǒng)的開(kāi)始菜單。

接下來(lái)我們隨便找一個(gè)應(yīng)用,右鍵,然后點(diǎn)擊 打開(kāi)文件位置,我們來(lái)看下這個(gè)EveryThing的具體位置。

我們會(huì)看到搜索框中看到的EveryThing是一個(gè)快捷方式,統(tǒng)一存放在系統(tǒng)的開(kāi)始菜單目錄下,
windows系統(tǒng)的開(kāi)始菜單有兩個(gè):一個(gè)是全局的開(kāi)始菜單,位于C:\ProgramData\Microsoft\Windows\Start Menu\Programs
目錄下。
另一個(gè)是針對(duì)每個(gè)用戶(hù)有一個(gè)單獨(dú)的開(kāi)始菜單,位于C:\Users\用戶(hù)名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
目錄下。
如果想在搜索框中看到我們自己的應(yīng)用,可以直接我們自己exe應(yīng)用的快捷方式復(fù)制到系統(tǒng)的開(kāi)始菜單目錄下,就可以在搜索框中搜索到我們自己的應(yīng)用了。


但是通過(guò)手動(dòng)方式將快捷方式復(fù)制到系統(tǒng)開(kāi)始菜單目錄下,只是普通用戶(hù)的做法,今天這篇文章,我們通過(guò)win32 api來(lái)演示一下如何創(chuàng)建一個(gè)快捷方式。
以下代碼基本是從MSDN是復(fù)制過(guò)來(lái)并且做了一部分修改,具體可以參考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創(chuàng)建快捷方式是通過(guò)COM組件的方式創(chuàng)建的,上述代碼聲明了一個(gè)C++函數(shù)CreateLink
,函數(shù)中有幾個(gè)比較重要的Windows Api依次和大家說(shuō)明一下。
1、CoInitialize(NULL);
初始化COM組件,這是調(diào)用COM組件必須要執(zhí)行的函數(shù)。
2、CoCreateInstance
實(shí)例化一個(gè)具體的COM組件,參數(shù)CLSID_ShellLink
可以理解為要實(shí)例化的COM組件的唯一Id。
3、QueryInterface
獲取到COM組件的接口,這個(gè)接口由COM組件提供,不同的COM組件接口不同,但都是調(diào)用QueryInterface
函數(shù)統(tǒng)一獲取到COM組件接口,接口以指針的形式返回,上述代碼中返回的接口為IPersistFile* ppf
。
4、ppf->Save
調(diào)用COM組件提供的函數(shù),在本示例中,Save函數(shù)指的是在指定位置創(chuàng)建一個(gè)快捷方式。
5、ppf->Release()
COM組件計(jì)數(shù)器減1,這個(gè)是COM組件調(diào)用必須的操作。
6、CoUninitialize()
釋放COM組件,和第一個(gè)函數(shù)CoInitialize(NULL);
必須同時(shí)出現(xiàn)。
有了上面這個(gè)創(chuàng)建快捷方式的函數(shù),我們來(lái)調(diào)用一下這個(gè)函數(shù)。如下代碼是為d:\7z2404-x64.exe
這個(gè)應(yīng)用程序創(chuàng)建一個(gè)快捷方式。SHGetKnownFolderPath
函數(shù)是win32的一個(gè)標(biāo)準(zhǔn)函數(shù),用于獲取windows系統(tǒng)中各種系統(tǒng)默認(rèn)的路徑,SHGetKnownFolderPath
的第一個(gè)參數(shù)是個(gè)枚舉,表示我們要獲取的目錄類(lèi)型,也就是你想獲取什么目錄,是系統(tǒng)的桌面路徑、下載路徑、圖片路徑還是什么路徑。具體看一參考MSDN的說(shuō)明:https://learn.microsoft.com/zh-cn/windows/win32/shell/knownfolderid
如下代碼中傳入的參數(shù)FOLDERID_Desktop
表示桌面,也就是說(shuō)我們會(huì)把快捷方式創(chuàng)建在桌面。FOLDERID_CommonPrograms
表示系統(tǒng)的開(kāi)始菜單目錄。
int main()
{
LPCWSTR lpszPathObj = L"d:\\7z2404-x64.exe";//源路徑
//設(shè)置快捷方式路徑
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");
}
閱讀原文:原文鏈接
該文章在 2025/3/31 11:18:39 編輯過(guò)