VC++创建快捷方式、删除快捷方式、添加开始菜单程序组菜单并删除程序组菜单的实例

转载:http://www.codefans.net/articles/1435.shtml

转载:http://www.cnblogs.com/morewindows/archive/2011/08/14/2138412.html

  1 //浏览文件夹
  2 BOOL CShortCutDlg::BrowseForFolder(
  3     LPITEMIDLIST pidlRoot,//浏览开始处的PIDL
  4     LPITEMIDLIST *ppidlDestination,
  5                 //浏览结束时所选择的PIDL
  6     LPCSTR lpszTitle)//浏览对话框中的提示文字
  7 {
  8     BROWSEINFO BrInfo ;
  9     ZeroMemory( &BrInfo, sizeof(BrInfo)) ;
 10     BrInfo.hwndOwner = HWND_DESKTOP ;
 11     BrInfo.pidlRoot = pidlRoot ;
 12     BrInfo.lpszTitle = lpszTitle ;
 13     //浏览文件夹
 14     *ppidlDestination= SHBrowseForFolder(&BrInfo);
 15     //用户选择了取消按钮
 16     if(NULL == *ppidlDestination)
 17         return FALSE ;
 18     return TRUE ;
 19 }
 20 //取得快捷方式的目标应用程序名
 21 BOOL CShortCutDlg::SelectMenuItem( LPSTR szFileName)
 22 {
 23     OPENFILENAME ofn ;
 24     static CHAR szFilter[] = "Programs\0*.exe\0" ;
 25     ZeroMemory(&ofn, sizeof( OPENFILENAME)) ;
 26     ofn.lStructSize = sizeof( OPENFILENAME) ;
 27     ofn.hwndOwner = HWND_DESKTOP;
 28     ofn.lpstrFilter = szFilter ;
 29     ofn.nFilterIndex = 0 ;
 30     ofn.nMaxFile = MAX_PATH ;
 31     ofn.lpstrTitle = "请选择目标应用程序:" ;
 32     ofn.lpstrFile = szFileName ;
 33     ofn.Flags = OFN_FILEMUSTEXIST |
 34             OFN_PATHMUSTEXIST | OFN_EXPLORER ;
 35     //文件浏览
 36     if(!GetOpenFileName( &ofn))//选择了取消按钮
 37         return FALSE ;
 38     return TRUE ;
 39 }
 40 //取得要创建的快捷方式的名字
 41 BOOL CShortCutDlg::GetShortcutCrt(LPSTR szPath)
 42 {
 43     LPITEMIDLIST pidlBeginAt, pidlDestination ;
 44 
 45     // 取得开始菜单或桌面的PIDL
 46     SHGetSpecialFolderLocation( HWND_DESKTOP,
 47                 nBeginAt, &pidlBeginAt) ;
 48     // 取得要创建的快捷方式所在的位置
 49     if( !BrowseForFolder(pidlBeginAt, &pidlDestination,
 50                 "请选择快捷方式所在的位置:"))
 51         return FALSE ;
 52     // 把PIDL转换为路径名
 53     SHGetPathFromIDList( pidlDestination, szPath) ;
 54     // 取得快捷方式名称
 55     CNameDlg name_dlg;
 56     if(name_dlg.DoModal() == IDCANCEL)
 57         return FALSE ;
 58     //把快捷方式名和扩展名.LNK添加到路径名后
 59     //形成完整的快捷方式数据文件名
 60     wsprintf(szPath+lstrlen(szPath),"\\%s.lnk",
 61                 name_dlg.m_strName) ;
 62     return TRUE ;
 63 }
 64 //创建快捷方式
 65 BOOL CShortCutDlg::CreateLink (
 66     LPSTR szPath,//快捷方式的目标应用程序名
 67     LPSTR szLink)//快捷方式的数据文件名(*.lnk)
 68 {
 69     HRESULT hres ;
 70     IShellLink * psl ;
 71     IPersistFile* ppf ;
 72     WORD wsz[ MAX_PATH] ;
 73     //创建一个IShellLink实例
 74     hres = CoCreateInstance( CLSID_ShellLink, NULL,
 75         CLSCTX_INPROC_SERVER, IID_IShellLink,
 76         (void **)&psl) ;
 77     if( FAILED( hres))
 78         return FALSE ;
 79     //设置目标应用程序
 80     psl -> SetPath( szPath) ;
 81     //设置快捷键(此处设为Shift+Ctrl+'R')
 82     psl -> SetHotkey( MAKEWORD( 'R',
 83         HOTKEYF_SHIFT |HOTKEYF_CONTROL)) ;
 84     //从IShellLink获取其IPersistFile接口
 85     //用于保存快捷方式的数据文件 (*.lnk)
 86     hres = psl -> QueryInterface( IID_IPersistFile,
 87         (void**)&ppf) ;
 88     if( FAILED( hres))
 89         return FALSE ;
 90     // 确保数据文件名为ANSI格式
 91     MultiByteToWideChar( CP_ACP, 0, szLink, -1,
 92         wsz, MAX_PATH) ;
 93     //调用IPersistFile::Save
 94     //保存快捷方式的数据文件 (*.lnk)
 95     hres = ppf -> Save( wsz, STGM_READWRITE) ;
 96     //释放IPersistFile和IShellLink接口
 97     ppf -> Release( ) ;
 98     psl -> Release( ) ;
 99     return TRUE;
100 }
101 BOOL CShortCutDlg::DeleteFolder( LPSTR pszFolder)
102 {
103     SHFILEOPSTRUCT fos ;
104 
105     ZeroMemory( &fos, sizeof( fos)) ;
106     fos.hwnd = HWND_DESKTOP;
107     fos.wFunc = FO_DELETE ;
108     fos.fFlags = FOF_SILENT | FOF_ALLOWUNDO ;
109     fos.pFrom = pszFolder ;
110     // 删除文件夹及其内容
111     if( 0 != SHFileOperation( &fos))
112         return FALSE ;
113     return TRUE;
114 }
115 //取得要删除的快捷方式
116 BOOL CShortCutDlg::GetShortcutDel (
117         LPSTR lpszInitDir,//选择文件的开始目录
118         LPSTR lpszShortcut)//快捷方式名
119 {
120     OPENFILENAME ofn ;
121     char szFilter[] = "Shortcuts\0*.lnk\0" ;
122     ZeroMemory(&ofn,sizeof( OPENFILENAME));
123     ofn.lStructSize = sizeof( OPENFILENAME) ;
124     ofn.hwndOwner = HWND_DESKTOP ;
125     ofn.lpstrFilter = szFilter ;
126     ofn.nFilterIndex = 0 ;
127     ofn.nMaxFile = MAX_PATH ;
128     ofn.lpstrTitle = "请选择要删除的快捷方式:" ;
129     ofn.lpstrFile = lpszShortcut;
130     ofn.lpstrInitialDir = lpszInitDir ;
131     ofn.Flags = OFN_FILEMUSTEXIST |
132         OFN_PATHMUSTEXIST | OFN_EXPLORER |
133         OFN_NODEREFERENCELINKS ;
134     //文件浏览
135     if(! GetOpenFileName( &ofn))//选择了取消按钮
136         return FALSE ;
137     return TRUE ;
138 }
139 //删除快捷方式的数据文件 (*.lnk)
140 BOOL CShortCutDlg::DeleteLink( LPSTR lpszShortcut)
141 {
142     SHFILEOPSTRUCT fos ;
143     ZeroMemory( &fos, sizeof(fos)) ;
144     fos.hwnd = HWND_DESKTOP ;
145     fos.wFunc = FO_DELETE ;
146     fos.pFrom = lpszShortcut;
147     fos.pTo = NULL ;
148     fos.fFlags = FOF_SILENT | FOF_ALLOWUNDO ;
149     //删除快捷方式(*.lnk)
150     if( 0 != SHFileOperation( &fos))
151         return FALSE ;
152     return TRUE ;
153 }
154 // 通知shell有关变化
155 void CShortCutDlg::NotifyShell(LONG wEventId,//事件标志
156             LPSTR szPath)//路径
157 {
158     SHChangeNotify( wEventId,
159                     SHCNF_FLUSH | SHCNF_PATH,
160                     szPath,0);
161     //取得szPath的父目录
162     char* p;
163     for( p=szPath+lstrlen(szPath)-1;
164             *p != '\\';
165             p--);
166     *p='\0';
167     SHChangeNotify(SHCNE_UPDATEDIR
168             |SHCNE_INTERRUPT,
169             SHCNF_FLUSH | SHCNF_PATH,szPath,0);
170 }
171 void CShortCutDlg::OnCreateGroup()
172 {
173     UpdateData(TRUE);
174     if(m_nLocation==0)
175     {
176         //设置起始文件夹为桌面
177         nBeginAt=CSIDL_DESKTOPDIRECTORY ;
178     }
179     else
180     {
181         //设置起始文件夹为“开始”菜单
182         nBeginAt=CSIDL_STARTMENU;
183     }
184     LPITEMIDLIST pidlBeginAt, pidlDestination ;
185     char szPath[ MAX_PATH] ;
186     // 取得开始菜单或桌面的PIDL
187     SHGetSpecialFolderLocation( HWND_DESKTOP,
188             nBeginAt, &pidlBeginAt) ;
189     // 取得新建文件夹的父文件夹
190     if( !BrowseForFolder(pidlBeginAt ,
191             &pidlDestination,
192             "请选择新建文件夹/菜单组的位置:"))
193         return ;
194     // 把PIDL转换为路径名
195     SHGetPathFromIDList( pidlDestination, szPath) ;
196     //取得新建文件夹的名字
197     CNameDlg name_dlg;
198     if(name_dlg.DoModal() == IDCANCEL)
199         return;
200     //形成完整的新建文件夹名
201     wsprintf(szPath+lstrlen(szPath),"\\%s",
202                 name_dlg.m_strName);
203     //创建文件夹(子目录)
204     if( !CreateDirectory( szPath, NULL))
205     {
206         MessageBox( "创建文件夹失败!") ;
207         return ;
208     }
209     // 通知shell有关变化
210     NotifyShell( SHCNE_MKDIR|SHCNE_INTERRUPT,
211                 szPath);
212 
213 }
214 void CShortCutDlg::OnCreateItem()
215 {
216     UpdateData(TRUE);
217     if(m_nLocation==0)
218     {
219         //设置起始文件夹为桌面
220         nBeginAt=CSIDL_DESKTOPDIRECTORY ;
221     }
222     else
223     {
224         //设置起始文件夹为“开始”菜单
225         nBeginAt=CSIDL_STARTMENU;
226     }
227     char szPath[MAX_PATH]="";
228                 //快捷方式的目标应用程序名
229     char szLink[MAX_PATH]="";
230                 //快捷方式的数据文件名
231     // 取得快捷方式的目标应用程序名
232     if( !SelectMenuItem( szPath))
233         return ;
234     // 取得新建快捷方式所在的文件夹
235     //并形成其数据文件名
236     if( !GetShortcutCrt( szLink))
237         return ;
238     // 创建快捷方式
239     if(!CreateLink( szPath, szLink) )
240         return;
241     // 通知shell有关变化
242     NotifyShell( SHCNE_CREATE|SHCNE_INTERRUPT,
243                 szLink) ;
244 }
245 void CShortCutDlg::OnDeleteGroup()
246 {
247     UpdateData(TRUE);
248     if(m_nLocation==0)
249     {
250         //设置起始文件夹为桌面
251         nBeginAt=CSIDL_DESKTOPDIRECTORY ;
252     }
253     else
254     {
255         //设置起始文件夹为“开始”菜单
256         nBeginAt=CSIDL_STARTMENU;
257     }
258     LPITEMIDLIST pidlBeginAt, pidlFolder ;
259     char szPath[MAX_PATH]="";
260     // 取得开始菜单或桌面的PIDL
261     SHGetSpecialFolderLocation( HWND_DESKTOP,
262                 nBeginAt, &pidlBeginAt) ;
263     // 取得要删除的文件夹
264     if( !BrowseForFolder( pidlBeginAt, &pidlFolder,
265             "请选择要删除的文件夹/菜单组:"))
266         return ;
267     // 把PIDL转化为路径名
268     SHGetPathFromIDList( pidlFolder, szPath) ;
269     // 删除文件夹
270     if(!DeleteFolder( szPath))
271         return ;
272     // 通知shell有关变化
273     NotifyShell( SHCNE_RMDIR|SHCNE_INTERRUPT,
274                     szPath) ;
275 }
276 void CShortCutDlg::OnDeleteItem()
277 {
278     UpdateData(TRUE);
279     if(m_nLocation==0)
280     {
281         //设置起始文件夹为桌面
282         nBeginAt=CSIDL_DESKTOPDIRECTORY ;
283     }
284     else
285     {
286         //设置起始文件夹为“开始”菜单
287         nBeginAt=CSIDL_STARTMENU;
288     }
289     LPITEMIDLIST pidlBeginAt ;
290     char szShortcut[ MAX_PATH]="",
291         szPath[ MAX_PATH]="";
292     // 取得开始菜单或桌面的PIDL
293     SHGetSpecialFolderLocation( HWND_DESKTOP,
294                 nBeginAt, &pidlBeginAt) ;
295     // 把PIDL转化为路径名
296     SHGetPathFromIDList( pidlBeginAt, szPath) ;
297     // 取得要删除的快捷方式
298     if( !GetShortcutDel( szPath, szShortcut))
299         return ;
300     // 删除快捷方式
301     if( !DeleteLink(szShortcut))
302         return ;
303     // 通知SHELL有关改变
304     NotifyShell( SHCNE_DELETE|SHCNE_INTERRUPT,
305                 szShortcut) ;
306 }
307 void CShortCutDlg::OnDestroy()
308 {
309     CoUninitialize();
310 
311     CDialog::OnDestroy();
312 }

 

你可能感兴趣的:(VC++创建快捷方式、删除快捷方式、添加开始菜单程序组菜单并删除程序组菜单的实例)