Win10对快速启动栏的设置在接口上并没有提供很好的方法,在网上找了一段是VBS和powershell写的,特地转成支持VC的版本:
void TaskbarPinWin10(LPCTSTR lpszFilePath,LPCTSTR lpszFileName)
{
do
{
TCHAR szVal[MAX_PATH]={0};
ULONG uValSize = MAX_PATH;
CRegKey regKey;
if (ERROR_SUCCESS!=regKey.Open(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CommandStore\\shell\\Windows.taskbarpin"),KEY_READ))
{
break;
}
if(ERROR_SUCCESS!=regKey.QueryStringValue(_T("ExplorerCommandHandler"),szVal,&uValSize))
{
break;
}
regKey.Close();
if (ERROR_SUCCESS!=regKey.Create(HKEY_CURRENT_USER,_T("SOFTWARE\\Classes\\*\\shell\\{:}")))
{
break;
}
if (ERROR_SUCCESS!=regKey.SetStringValue(_T("ExplorerCommandHandler"),szVal))
{
break;
}
regKey.Close();
IShellDispatch* pShellDisp = NULL;
Folder *pFolder;
FolderItem *pFolderItem;
CComBSTR stitle,str;
HRESULT hr = S_OK;
hr = ::CoCreateInstance( CLSID_Shell, NULL,
CLSCTX_SERVER, IID_IShellDispatch, (LPVOID*)&pShellDisp);
if(SUCCEEDED(hr))
{
hr = pShellDisp->NameSpace(CComVariant(lpszFilePath),&pFolder);
hr = pFolder->ParseName(CComBSTR(lpszFileName),&pFolderItem);
if (SUCCEEDED(hr))
{
pFolderItem->InvokeVerb(CComVariant(_T("{:}")));
}
hr = pShellDisp->Release();
pShellDisp = NULL;
}
if (ERROR_SUCCESS!=regKey.Open(HKEY_CURRENT_USER,_T("SOFTWARE\\Classes\\*\\shell"),KEY_READ|KEY_WRITE))
{
break;
}
regKey.RecurseDeleteKey(_T("{:}"));
regKey.Close();
} while (FALSE);
}
调用方法:
CString strLinkPath = _T("C:\\Users\\test\\Desktop");
CString strLinkName = _T("Google Chrome.lnk");
TaskbarPinWin10(strLinkPath ,strLinkName);
我是用快捷方式设置到快速启动栏,当然你也可以直接用EXE,修改StrLinkPath为exe所在路径,strLinkName为exe文件名即可。
这个方法调用一次如果任务栏没有我们的图标就会自动设置上去,有的话会自动取消,如果你只想取消那你可以先枚举
%appdata%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
这个目录下有没有你的快捷方式,这个目录就是存放任务栏快捷方式的。先判断存在与否,存在再调用上面的函数即可,这个在做卸载程序的时候就用到。