12.1.4 创建/删除快捷方式的技巧
1.问题阐述
Windows的快捷方式实际上是一个带有扩展名LNK的数据文件,快捷方式中包括所指对象的大量的信息,如目标对象的路径和名称,工作目录,要传递的命令行参数,运行时的初始显示状态,图标及其快捷键等。通过在快捷方式上单击鼠标右键并在弹出菜单中选择【属性】命令可以观察该快捷方式的这些性质。
快捷方式的数据文件如果存放在C:\Windows\Desktop子目录下,这个快捷方式就会显示在桌面上,而如果存放在C:\Windows\Start Menu\Programs子目录下,这个快捷方式就会作为【开始】菜单的一个菜单项出现。
在操作系统中,通过手工操作建立这些应用程序的快捷方式并不复杂,在此不再赘述,在应用程序中如何完成上述的工作呢?
2.实现技巧
Windows外壳(Shell)的快捷方式是以OLE技术的组件对象模型COM(Component ObjectModal)为基础而设计的。利用COM模型,一个应用程序可以调用另一应用程序的某些功能。创建Windows的快捷方式比较容易,首先利用OLE通过调用CoCreateInstance()函数建立一个IID_IShellLink实例,并同时得到其接口指针。利用这个接口指针可以对其各项属性进行设置。为了使这些信息以快捷方式的数据文件(*.lnk)格式保存起来,还需要从IID_IShellLink对象取得其IID_IPersistFile接口指针,以便于调用其成员函数Save()保存前面设置的信息。
3.实例代码
本实例演示了如何利用IshellLink接口创建快捷方式。创建一个基于对话框的工程,工程名为ShortCut。
快捷方式生成代码:
void CShortCutDlg::OnCtreateBtn() { GetDlgItemText(IDC_EDIT2,m_strLnkPath); if(m_strLnkPath == "") { MessageBox("请输入快捷方式的路径"); return ; } CreateShortCut((LPCTSTR)(m_strDesPath),(LPCTSTR)m_strLnkPath); } |
创建快捷方式的代码:
/************************************************************************/ /* 作用:建立块捷方式 /* 参数 lpExeName:EXE 文件全路径名 /* 参数 lpLinkPath:快捷方式文件全路径名 /* /************************************************************************/ void CShortCutDlg::CreateShortCut(LPCTSTR lpExeName,LPCTSTR lpLinkPath) { IShellLink * psl = NULL; IPersistFile * ppf = NULL; HRESULT hr = ::CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID *)&psl ); // 获取接口实例 if (SUCCEEDED(hr)) { psl->SetPath( lpExeName ); // 全路径程序名 psl->SetIconLocation("moon_ie.ico",0); psl -> SetHotkey( MAKEWORD( 'X', HOTKEYF_SHIFT |HOTKEYF_CONTROL)) ; psl->SetDescription("create a short cut"); hr = psl->QueryInterface( // 查找持续性文件接口指针 IID_IPersistFile, // 持续性接口 IID (LPVOID *)&ppf ); // 得到接口指针 if ( SUCCEEDED(hr) ) { USES_CONVERSION; ppf->Save( T2COLE( lpLinkPath ), TRUE ); // 保存 } } if ( ppf ) ppf->Release(); if ( psl ) psl->Release(); } |
选择快捷方式的目标文件:
void CShortCutDlg::OnFindFileBtn() { CFileDialog file(TRUE,".exe",".exe",OFN_HIDEREADONLY | OFN_ OVERWRITEPROMPT,"文件(*.exe)|*.exe||",NULL); if(file.DoModal() == IDOK) { m_strDesPath = file.GetPathName(); SetDlgItemText(IDC_EDIT1,m_strDesPath); } }
|
【责任编辑:
夏书 TEL:(010)68476606】