zoukankan      html  css  js  c++  java
  • 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*.exe" ;
     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*.lnk" ;
    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='';
    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 }
  • 相关阅读:
    【例题 6-21 UVA
    【例题 6-20 UVA
    【Codeforces Round #446 (Div. 2) C】Pride
    【Codeforces Round #446 (Div. 2) B】Wrath
    【Codeforces Round #446 (Div. 2) A】Greed
    【例题 6-19 UVA
    【CF675C】Money Transfers(离散化,贪心)
    【CF659E】New Reform(图的联通,环)
    【POJ1276】Cash Machine(多重背包单调队列优化)
    【HDU3507】Print Article(斜率优化DP)
  • 原文地址:https://www.cnblogs.com/chechen/p/5170221.html
Copyright © 2011-2022 走看看