首先需要获取三个路径 :桌面路径 、快速启动栏路径、 开始->程序组路径
//得到当前桌面路径 BOOL GetDesktopPath(char *pszDesktopPath) { LPITEMIDLIST ppidl = NULL; if (SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &ppidl) == S_OK) { BOOL flag = SHGetPathFromIDList(ppidl, pszDesktopPath); CoTaskMemFree(ppidl); return flag; } return FALSE; }//得到快速启动栏的路径 BOOL GetIEQuickLaunchPath(char *pszIEQueickLaunchPath) {LPITEMIDLIST ppidl; if (SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &ppidl) == S_OK) { BOOL flag = SHGetPathFromIDList(ppidl, pszIEQueickLaunchPath); strcat(pszIEQueickLaunchPath, "\\Microsoft\\Internet Explorer\\Quick Launch"); CoTaskMemFree(ppidl); return flag; } return FALSE; } //得到 开始->程序组 的路径 BOOL GetProgramsPath(char *pszProgramsPath) { LPITEMIDLIST ppidl; if (SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &ppidl) == S_OK) { BOOL flag = SHGetPathFromIDList(ppidl, pszProgramsPath); CoTaskMemFree(ppidl); return flag; } return FALSE; }
这样返回的 pszProgramsPath就是指当前获取的路径
程序的思路:得到路径,在当前路径下创建exe相对应的快捷方式,并通过ShellExecute函数来锁定到快速启动栏或开始菜单
/* 函数功能:对指定文件在指定的目录下创建其快捷方式 函数参数: lpszFileName 指定文件,为NULL表示当前进程的EXE文件。 lpszLnkFileDir 指定目录,不能为NULL。 lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。 wHotkey 为0表示不设置快捷键 pszDescription 备注 iShowCmd 运行方式,默认为常规窗口 */ BOOL CreateFileShortcut(LPCSTR lpszFileName, LPCSTR lpszLnkFileDir, LPCSTR lpszLnkFileName, LPCSTR lpszWorkDir, WORD wHotkey, LPCTSTR lpszDescription, int iShowCmd = SW_SHOWNORMAL) { if (lpszLnkFileDir == NULL) return FALSE; HRESULT hr; IShellLink*pLink; //IShellLink对象指针 IPersistFile *ppf; //IPersisFil对象指针 //创建IShellLink对象 hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pLink); if (FAILED(hr)) return FALSE; //从IShellLink对象中获取IPersistFile接口 hr = pLink->QueryInterface(IID_IPersistFile, (void**)&ppf); if (FAILED(hr)) { pLink->Release(); return FALSE; } //获取当前exe所在路径TCHAR exeFullPath[MAX_PATH]; // MAX_PATHGetModuleFileName(NULL,exeFullPath,MAX_PATH);//目标 if (lpszFileName == NULL) pLink->SetPath(_pgmptr); else pLink->SetPath(exeFullPath); //工作目录 if (lpszWorkDir != NULL) pLink->SetWorkingDirectory(lpszWorkDir); //快捷键 if (wHotkey != 0) pLink->SetHotkey(wHotkey); //备注 if (lpszDescription != NULL) pLink->SetDescription(lpszDescription); //显示方式 pLink->SetShowCmd(iShowCmd); //快捷方式的路径 + 名称 char szBuffer[MAX_PATH]; if (lpszLnkFileName != NULL) //指定了快捷方式的名称 sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, lpszLnkFileName); else{ //没有指定名称,就从取指定文件的文件名作为快捷方式名称。 //char *pstr; char *buf = new char[strlen(lpszFileName)+1];strcpy(buf, lpszFileName); if (buf == NULL) {ppf->Release(); pLink->Release(); return FALSE; } //注意后缀名要从.exe改为.lnk sprintf(szBuffer, "%s\\%s", lpszLnkFileDir, buf); int nLen = strlen(szBuffer);//char lkName = ;strcat(szBuffer, ".lnk");} //保存快捷方式到指定目录下 WCHAR wsz[MAX_PATH]; //定义Unicode字符串 MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wsz, MAX_PATH); hr = ppf->Save(wsz, TRUE); ppf->Release(); pLink->Release(); CoUninitialize(); //释放com接口return SUCCEEDED(hr); }
下面说一下调用 :
char szPath[MAX_PATH]; CoInitialize(NULL); GetDesktopPath(szPath);//GetIEQuickLaunchPath(szPath);//GetProgramsPath(szPath);if (!CreateFileShortcut(_T("QQMusicEx"), szPath, NULL, NULL, 0 , NULL)) return ;else{//strcat(szPath,"\\QQMusicEx.lnk");//ShellExecute(NULL,_T("TaskbarPin"), szPath, NULL, NULL, SW_SHOW); // 锁定程序到任务栏//ShellExecute(NULL,_T("startpin"), szPath, NULL, NULL, SW_SHOW); // 锁定程序到开始菜单//startpin}
红色代表桌面快捷方式,下面的else注释掉
蓝色放开注释,else里面的strcat跟着一起放开
紫色放开注释,else操作同上
注意:1. 需要注意的是 在创建开解方式的时候需要添加头文件
#include <shlobj.h>#pragma comment(lib, "shell32.lib")
2. TaskbarPin是锁定 Task barUnpin是解锁
startpin和startunpin是相对应的
如果觉得《创建快捷方式 (并添加到快速启动栏 桌面 开始菜单)》对你有帮助,请点赞、收藏,并留下你的观点哦!