VC++创建快捷方式、删除快捷方式、添加开始菜单程序组菜单并删除程序组菜单的实例
转载:http://www.codefans.net/articles/1435.shtml
转载:http://www.cnblogs.com/morewindows/archive/2011/08/14/2138412.html
//浏览文件夹
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 = ;
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 ;
WORD 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, , szLink, -,
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( != 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 = ;
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( != SHFileOperation( &fos))
return FALSE ;
return TRUE ;
}
// 通知shell有关变化
void CShortCutDlg::NotifyShell(LONG wEventId,//事件标志
LPSTR szPath)//路径
{
SHChangeNotify( wEventId,
SHCNF_FLUSH | SHCNF_PATH,
szPath,);
//取得szPath的父目录
char* p;
for( p=szPath+lstrlen(szPath)-;
*p != '\\';
p--);
*p='\0';
SHChangeNotify(SHCNE_UPDATEDIR
|SHCNE_INTERRUPT,
SHCNF_FLUSH | SHCNF_PATH,szPath,);
}
void CShortCutDlg::OnCreateGroup()
{
UpdateData(TRUE);
if(m_nLocation==)
{
//设置起始文件夹为桌面
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==)
{
//设置起始文件夹为桌面
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==)
{
//设置起始文件夹为桌面
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==)
{
//设置起始文件夹为桌面
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();
}
VC++创建快捷方式、删除快捷方式、添加开始菜单程序组菜单并删除程序组菜单的实例的更多相关文章
- VC/Wince 实现仿Win8 Metro风格界面3——按钮移动交换、删除、添加快捷方式(附效果图)
上一篇文章写了如何进行页面滑动切换,今天我讲一下如何实现两个按钮拖动交换位置,包括同一个页面按钮交换或者两个页面之间的按钮交换.另外就是如何拖动删除界面上的快捷方式.按钮交换和拖动删除,这两个功能基本 ...
- [Android Pro] 创建快捷方式,删除快捷方式,查询是否存在快捷方式
1: 创建快捷方式 需要权限: <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORT ...
- vb和dos批处理创建或生成快捷方式
https://www.cnblogs.com/gszhl/archive/2009/04/23/1441753.html vb和dos批处理创建或生成快捷方式 首先说我现在用的一种,最有效的也是 ...
- Ubuntu创建启动器(快捷方式)的方式
解压.tar.gz的navicat之后发现不能自动生成启动器了,研究了一下发现: 虽然不少带有图形界面的程序会在安装时自动在桌面上创建快捷方式,还有一些图形界面程序或者命令行程序可能需要你手动创建快捷 ...
- Android 快捷方式的创建与查询 快捷方式问题大全 获取快捷方式在Launcher数据库中的信息 Failed to find provider info for com.android.la
/** * 创建添加快捷方式 * 其中需要设置的有: * 1. 快捷方式的标题 * 2. 快捷方式的图标 * 3. 点击快捷方式后的跳转 */ public static void createSho ...
- ubuntu系统下创建软件桌面快捷方式
转自ubuntu系统下创建软件桌面快捷方式 默认情况下,ubuntu会将自动安装的软件快捷方式保存在/usr/share/applications目录下,如果我们要创建桌面快捷方式,只需要右键-复制- ...
- Windows Server 2008 R2组策略创建用户桌面快捷方式
问题: 如何让所有域用户桌面有一个公司共享的快捷方式,让所有域用户直接双击就能打开公司共享. 解决办法: 1.创建一个zhuyu组织单元 ----- 在zhuyu组织单元创建一个域用户user1. 2 ...
- NSIS学习记录の----win8.1和win10对于NSIS创建的卸载快捷方式无法在开始目录下显示
NSIS提供了很好的软件卸载功能编写的方法,但是针对win8.1和win10操作系统,由于开始目录的权限限制,我们有时候并不能完美的完成所需要的功能----卸载程序的快捷方式不能显示.话不多说,下面提 ...
- Oracle的学习二:表管理(数据类型、创建/修改表、添加/修改/删除数据、数据查询)
1.Oracle表的管理 表名和列名的命名规则: 必须以字母开头: 长度不能超过30个字符: 不能使用oracle的保留字: 只能使用如下字符:A-Z, a-z, 0-9, $, # 等. Oracl ...
随机推荐
- Python实现简单HTTP服务器(一)
一.返回固定内容 # coding:utf-8 import socket from multiprocessing import Process def handle_client(client_s ...
- ls 列出文件目录(可以含子目录)及文件的完整路径
1.列出当前目录的文件.文件夹完整路径 ls -1 |awk '{print i$0}' i=`pwd`'/' 2.列出当前目录及子目录的文件.文件夹完整路径 ls -R |awk '{p ...
- SVM计算过程,对偶形式,核函数
SVM是一个分类方法,用w^X+b定义分类函数, 于是求w.b,为寻最大间隔,引出1/2||w||^2,继而引入拉格朗日因子,化为对单一因数对偶变量a的求解(求解过程中会涉及到一系列最优化或凸二 次规 ...
- soapUI-Groovy Script
1.1.1 Groovy Script soapUI通过以groovy语言编写的脚本来大量支持您的项目. Groovy脚本TestSteps可用于向功能TestCase添加任意功能. 脚本断言用于任 ...
- Windows多线程基础
进程与线程基础 程序: 计算机指令的集合,以文件的形式存储在磁盘上 进程: 正在运行是程序实例,以是一个程序在其自身的地址空间的一次执行活动.进程有一个进程管理的内核对象和地址空间组成. 线程: 程序 ...
- Twitter OA prepare: Rational Sum
In mathematics, a rational number is any number that can be expressed in the form of a fraction p/q ...
- 174. Dungeon Game(动态规划)
The demons had captured the princess (P) and imprisoned her in the bottom-right corner of a dungeon. ...
- VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类)
上一节中鸡啄米讲了MFC异常处理,本节的主要内容是字体CFont类. 字体简介 GDI(Graphics Device Interface),图形设备接口,是Windows提供的一些函数和结构,用于在 ...
- hdu4991 树状数组+dp
这题说的是给了一个序列长度为n 然后求这个序列的严格递增序列长度是m的方案有多少种,如果用dp做那么对于状态有dp[n][m]=dp[10000][100],时间复杂度为n*m*n接受不了那么想想是否 ...
- 20154312 曾林 EXP7 网络欺诈防范
目录 1.基础问题回答 ----1.1.通常在什么场景下容易受到DNS spoof攻击 ----1.2.在日常生活工作中如何防范以上两攻击方法 2.实践总结与体会 3.实践过程记录 ----3.1.简 ...