MFC添加快捷方式和删除快捷方式

来源:互联网 发布:软件性能测试视频 编辑:程序博客网 时间:2024/05/19 07:26
http://download.csdn.net/download/thanklife/9938163 项目工程在此
//浏览文件夹BOOL CShortCutDlg::BrowseForFolder(    LPITEMIDLIST pidlRoot,//浏览开始处的PIDL    LPITEMIDLIST *ppidlDestination,                //浏览结束时所选择的PIDL    LPCSTR lpszTitle)//浏览对话框中的提示文字{    BROWSEINFO BrInfo ;    ZeroMemory( &BrInfo, sizeof(BrInfo)) ;    BrInfo.hwndOwner = HWND_DESKTOP ;    BrInfo.pidlRoot = pidlRoot ;    BrInfo.lpszTitle = lpszTitle ;    //浏览文件夹    *ppidlDestination= SHBrowseForFolder(&BrInfo);    //用户选择了取消按钮    if(NULL == *ppidlDestination)        return FALSE ;    return TRUE ;}//取得快捷方式的目标应用程序名BOOL CShortCutDlg::SelectMenuItem( LPSTR szFileName){    OPENFILENAME ofn ;    static CHAR szFilter[] = "Programs\0*.exe\0" ;    ZeroMemory(&ofn, sizeof( OPENFILENAME)) ;    ofn.lStructSize = sizeof( OPENFILENAME) ;    ofn.hwndOwner = HWND_DESKTOP;    ofn.lpstrFilter = szFilter ;    ofn.nFilterIndex = 0 ;    ofn.nMaxFile = MAX_PATH ;    ofn.lpstrTitle = "请选择目标应用程序:" ;    ofn.lpstrFile = szFileName ;    ofn.Flags = OFN_FILEMUSTEXIST |             OFN_PATHMUSTEXIST | OFN_EXPLORER ;    //文件浏览    if(!GetOpenFileName( &ofn))//选择了取消按钮        return FALSE ;    return TRUE ;}//取得要创建的快捷方式的名字BOOL CShortCutDlg::GetShortcutCrt(LPSTR szPath){    LPITEMIDLIST pidlBeginAt, pidlDestination ;        // 取得开始菜单或桌面的PIDL    SHGetSpecialFolderLocation( HWND_DESKTOP,                 nBeginAt, &pidlBeginAt) ;    // 取得要创建的快捷方式所在的位置    if( !BrowseForFolder(pidlBeginAt,                         &pidlDestination,                 "请选择快捷方式所在的位置:"))        return FALSE ;    // 把PIDL转换为路径名    SHGetPathFromIDList( pidlDestination, szPath) ;    // 取得快捷方式名称    CNameDlg name_dlg;if(name_dlg.DoModal() == IDCANCEL)            return FALSE ;    //把快捷方式名和扩展名.LNK添加到路径名后    //形成完整的快捷方式数据文件名    wsprintf(szPath+lstrlen(szPath),"\\%s.lnk",                 name_dlg.m_strName) ;    return TRUE ;}//创建快捷方式BOOL CShortCutDlg::CreateLink (     LPSTR szPath,//快捷方式的目标应用程序名    LPSTR szLink)//快捷方式的数据文件名(*.lnk){HRESULT hres ;IShellLink * psl ;IPersistFile* ppf ;WCHAR wsz[ MAX_PATH] ;    //创建一个IShellLink实例    hres = CoCreateInstance( CLSID_ShellLink, NULL,        CLSCTX_INPROC_SERVER, IID_IShellLink,        (void **)&psl) ;if( FAILED( hres))        return FALSE ;    //设置目标应用程序    psl -> SetPath( szPath) ;    //设置快捷键(此处设为Shift+Ctrl+'R')    psl -> SetHotkey( MAKEWORD( 'R',HOTKEYF_SHIFT |HOTKEYF_CONTROL)) ;    //从IShellLink获取其IPersistFile接口    //用于保存快捷方式的数据文件 (*.lnk)    hres = psl -> QueryInterface( IID_IPersistFile,(void**)&ppf) ;if( FAILED( hres))        return FALSE ;// 确保数据文件名为ANSI格式MultiByteToWideChar( CP_ACP, 0, szLink, -1, wsz, MAX_PATH) ;    //调用IPersistFile::Save    //保存快捷方式的数据文件 (*.lnk)hres = ppf -> Save( wsz, STGM_READWRITE) ;    //释放IPersistFile和IShellLink接口ppf -> Release( ) ;psl -> Release( ) ;return TRUE;}BOOL CShortCutDlg::DeleteFolder( LPSTR pszFolder){    SHFILEOPSTRUCT fos ;        ZeroMemory( &fos, sizeof( fos)) ;    fos.hwnd = HWND_DESKTOP;    fos.wFunc = FO_DELETE ;    fos.fFlags = FOF_SILENT | FOF_ALLOWUNDO ;    fos.pFrom = pszFolder ;    // 删除文件夹及其内容    if( 0 != SHFileOperation( &fos))        return FALSE ;    return TRUE;}//取得要删除的快捷方式BOOL CShortCutDlg::GetShortcutDel (        LPSTR lpszInitDir,//选择文件的开始目录        LPSTR lpszShortcut)//快捷方式名{    OPENFILENAME ofn ;    char szFilter[] = "Shortcuts\0*.lnk\0" ;    ZeroMemory(&ofn,sizeof( OPENFILENAME));    ofn.lStructSize = sizeof( OPENFILENAME) ;    ofn.hwndOwner = HWND_DESKTOP ;    ofn.lpstrFilter = szFilter ;    ofn.nFilterIndex = 0 ;    ofn.nMaxFile = MAX_PATH ;    ofn.lpstrTitle = "请选择要删除的快捷方式:" ;    ofn.lpstrFile = lpszShortcut;    ofn.lpstrInitialDir = lpszInitDir ;    ofn.Flags = OFN_FILEMUSTEXIST |         OFN_PATHMUSTEXIST | OFN_EXPLORER |        OFN_NODEREFERENCELINKS ;    //文件浏览    if(! GetOpenFileName( &ofn))//选择了取消按钮        return FALSE ;    return TRUE ;}//删除快捷方式的数据文件 (*.lnk)BOOL CShortCutDlg::DeleteLink( LPSTR lpszShortcut){    SHFILEOPSTRUCT fos ;    ZeroMemory( &fos, sizeof(fos)) ;    fos.hwnd = HWND_DESKTOP ;    fos.wFunc = FO_DELETE ;    fos.pFrom = lpszShortcut;    fos.pTo = NULL ;    fos.fFlags = FOF_SILENT | FOF_ALLOWUNDO ;    //删除快捷方式(*.lnk)    if( 0 != SHFileOperation( &fos))        return FALSE ;    return TRUE ;}// 通知shell有关变化void CShortCutDlg::NotifyShell(LONG wEventId,//事件标志            LPSTR szPath)//路径{        SHChangeNotify( wEventId,                    SHCNF_FLUSH | SHCNF_PATH,                    szPath,0);    //取得szPath的父目录    char* p;    for( p=szPath+lstrlen(szPath)-1;            *p != '\\';             p--);    *p='\0';    SHChangeNotify(SHCNE_UPDATEDIR            |SHCNE_INTERRUPT,             SHCNF_FLUSH | SHCNF_PATH,szPath,0);}void CShortCutDlg::OnCreateGroup() {UpdateData(TRUE);if(m_nLocation==0){//设置起始文件夹为桌面nBeginAt=CSIDL_DESKTOPDIRECTORY ;    }else{//设置起始文件夹为“开始”菜单nBeginAt=CSIDL_STARTMENU;}LPITEMIDLIST pidlBeginAt, pidlDestination ;    char szPath[ MAX_PATH] ;    // 取得开始菜单或桌面的PIDL    SHGetSpecialFolderLocation( HWND_DESKTOP,             nBeginAt, &pidlBeginAt) ;    // 取得新建文件夹的父文件夹    if( !BrowseForFolder(pidlBeginAt ,             &pidlDestination,            "请选择新建文件夹/菜单组的位置:"))        return ;    // 把PIDL转换为路径名    SHGetPathFromIDList( pidlDestination, szPath) ;    //取得新建文件夹的名字    CNameDlg name_dlg;    if(name_dlg.DoModal() == IDCANCEL)        return;    //形成完整的新建文件夹名    wsprintf(szPath+lstrlen(szPath),"\\%s",                name_dlg.m_strName);    //创建文件夹(子目录)    if( !CreateDirectory( szPath, NULL))    {        MessageBox( "创建文件夹失败!") ;        return ;    }    // 通知shell有关变化    NotifyShell( SHCNE_MKDIR|SHCNE_INTERRUPT,                szPath);}void CShortCutDlg::OnCreateItem() {UpdateData(TRUE);if(m_nLocation==0){//设置起始文件夹为桌面nBeginAt=CSIDL_DESKTOPDIRECTORY ;    }else{//设置起始文件夹为“开始”菜单nBeginAt=CSIDL_STARTMENU;}char szPath[MAX_PATH]="";                //快捷方式的目标应用程序名    char szLink[MAX_PATH]="";                //快捷方式的数据文件名    // 取得快捷方式的目标应用程序名    if( !SelectMenuItem( szPath))        return ;    // 取得新建快捷方式所在的文件夹    //并形成其数据文件名    if( !GetShortcutCrt( szLink))        return ;    // 创建快捷方式    if(!CreateLink( szPath, szLink) )        return;    // 通知shell有关变化    NotifyShell( SHCNE_CREATE|SHCNE_INTERRUPT,                 szLink) ;}void CShortCutDlg::OnDeleteGroup() {UpdateData(TRUE);if(m_nLocation==0){//设置起始文件夹为桌面nBeginAt=CSIDL_DESKTOPDIRECTORY ;    }else{//设置起始文件夹为“开始”菜单nBeginAt=CSIDL_STARTMENU;}LPITEMIDLIST pidlBeginAt, pidlFolder ;    char szPath[MAX_PATH]="";    // 取得开始菜单或桌面的PIDL    SHGetSpecialFolderLocation( HWND_DESKTOP,                 nBeginAt, &pidlBeginAt) ;    // 取得要删除的文件夹    if( !BrowseForFolder( pidlBeginAt, &pidlFolder,             "请选择要删除的文件夹/菜单组:"))        return ;    // 把PIDL转化为路径名    SHGetPathFromIDList( pidlFolder, szPath) ;    // 删除文件夹    if(!DeleteFolder( szPath))        return ;    // 通知shell有关变化    NotifyShell( SHCNE_RMDIR|SHCNE_INTERRUPT,                     szPath) ;}void CShortCutDlg::OnDeleteItem() {UpdateData(TRUE);if(m_nLocation==0){//设置起始文件夹为桌面nBeginAt=CSIDL_DESKTOPDIRECTORY ;    }else{//设置起始文件夹为“开始”菜单nBeginAt=CSIDL_STARTMENU;}LPITEMIDLIST pidlBeginAt ;    char szShortcut[ MAX_PATH]="",        szPath[ MAX_PATH]="";    // 取得开始菜单或桌面的PIDL    SHGetSpecialFolderLocation( HWND_DESKTOP,                 nBeginAt, &pidlBeginAt) ;    // 把PIDL转化为路径名    SHGetPathFromIDList( pidlBeginAt, szPath) ;    // 取得要删除的快捷方式    if( !GetShortcutDel( szPath, szShortcut))        return ;    // 删除快捷方式    if( !DeleteLink(szShortcut))        return ;    // 通知SHELL有关改变    NotifyShell( SHCNE_DELETE|SHCNE_INTERRUPT,                 szShortcut) ;}void CShortCutDlg::OnDestroy() {CoUninitialize();    CDialog::OnDestroy();}

阅读全文
0 0
原创粉丝点击