删除桌面快捷方式其实是删除桌面上的快捷方式文件,那我们如何去删除桌面快捷方式文件呢?软件可能已经发布过多个版本,其中的一些版本的快捷方式文件名称可能了多次改动,程序中不可能记录每个版本的快捷方式名称,没法直接去删除快捷方式文件。本文就给出一种有效的处理办法,能很好地满足实际的需求。
-
实现思路
删除指定程序的桌面快捷方式的具体思路是,先获取桌面的完整路径,然后遍历桌面文件夹中的所有.lnk快捷方式文件,然后通过IShellLink COM接口去获取快捷方向的exe名称,通过比对exe名称,确定是我们软件的桌面快捷方式。找到快捷方式文件,删除即可。一般情况下,软件的exe程序是不怎么变动的,所以这种方法是比行的。
删除桌面快捷方式操作一般在安装包中进行的。在启动安装包安装程序时,会先将程序老的桌面快捷方式和开始菜单快捷方式删除,然后再去创建新的桌面和开始菜单方式。
-
调用SHGetSpecialFolderLocation获取桌面的路径
通过调用系统API接口SHGetSpecialFolderLocation,我们可以获取多个系统路径,比如所有用户的公用桌面路径(传入CSIDL_COMMON_DESKTOPDIRECTORY参数),前登录用户的appdata路径(传入CSIDL_APPDATA)等。
此处我们假定软件的快捷方式是放置在公用桌面上的,我们就要使用CSIDL_COMMON_DESKTOPDIRECTORY参数去获取公用桌面的路径:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| CString strCommonDesktopPath; bRet = GetSpecialFolderPath( strCommonDesktopPath, CSIDL_COMMON_DESKTOPDIRECTORY );
BOOL GetSpecialFolderPath( CString& strFolderPath, int nFolderType ) { LPITEMIDLIST ppidl; if ( SHGetSpecialFolderLocation( NULL, nFolderType, &ppidl ) == S_OK ) { TCHAR achTargetPath[MAX_PATH] = { 0 }; BOOL bRet = SHGetPathFromIDList( ppidl, achTargetPath ); strFolderPath = achTargetPath; CoTaskMemFree( ppidl ); return bRet; }
return FALSE; }
|
- 通过IShellLink COM接口获取快捷方式指向的exe文件完整路径
通过IShellLink COM接口类获取快捷方式指向的exe文件完整路径,然后判断是否是我们的程序,封装的接口如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| BOOL IsTargetLnkFile( CString strLnkPath ) { HRESULT hres; IShellLink *psl; IPersistFile *ppf;
BOOL bTarget = FALSE;
hres = CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&psl ); if ( !SUCCEEDED(hres) ) { return bTarget; }
hres = psl->QueryInterface( IID_IPersistFile, (void**)&ppf ); if( SUCCEEDED(hres) ) { TCHAR achLnkExeFilePath[MAX_PATH*2] = { 0 }; hres = ppf->Load( strLnkPath, 0 ); if( SUCCEEDED(hres) ) { WIN32_FIND_DATA wfd; hres = psl->GetPath( achLnkExeFilePath, sizeof(achLnkExeFilePath), &wfd, 0 ); }
CUIString strExePath = achLnkExeFilePath; if ( strExePath .Find( _T("Test.exe") ) != -1 ) { bTarget = TRUE; }
ppf->Release(); } psl->Release();
return bTarget; }
|
- 遍历桌面文件中的所有快捷方式文件,找出我们程序的快捷方式
相关函数的实现上面已经给出了,下面就轮到我们去遍历桌面文件夹中的所有快捷方式文件,然后判断是否是我们程序的,然后删除之。相关代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| CString strCommonDesktopPath; bRet = GetSpecialFolderPath( strCommonDesktopPath, CSIDL_COMMON_DESKTOPDIRECTORY ); if ( !bRet ) { return; }
DeleteDesktopShortCut( strCommonDesktopPath ); void DeleteDesktopShortCut( const CString strDir ) { CString strFilePath; CFileFind fileFinder; BOOL bFind = fileFinder.FindFile( strDir + _T("\\*.*") ); while ( bFind ) { bFind = fileFinder.FindNextFile(); if( !fileFinder.IsDots() ) { strFilePath = fileFinder.GetFilePath(); if( fileFinder.IsDirectory() ) { continue; }
int nLen = strFilePath.GetLength(); if( nLen > 4 && !_tcscmp( strFilePath.Right(4), _T(".lnk") ) ) { BOOL bTarget = IsTargetLnkFile( strFilePath ); if ( bTarget ) { DeleteFile( strFilePath ); } } } }
fileFinder.Close(); }
|
有人可能会问,那我要删除开始菜单中的快捷方式该怎么弄呢?其实很简单,上述接口是通用的,只要传入开始菜单文件夹路径进去就可以了。