首先需要获取三个路径 :桌面路径 、快速启动栏路径、 开始->程序组路径
//得到当前桌面路径
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_PATH
GetModuleFileName(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是相对应的