




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC 为程序创建快捷方式的详细讲解 有时候,为了方便用户使用我们编写的程序,需要在桌面,快速启动或程序组中创建程序的快捷方式。下面就介绍在VC下如何为程序创建快捷方式。 一得到桌面,快速启动或程序组的路径这里介绍二个win32 API函数来完成这个任务。第一个函数 获得系统特殊路径 1. HRESULT SHGetSpecialFolderLocation( 2.3. HWND hwndOwner, int nFolder, PIDLIST_ABSOLUTE *ppidl 4.5. ); 第一个参数表示所有者窗口句柄,一般传入NULL就可以了。第二个参数要示是一个整数id,决定哪个目录是待查找目录,它的取值可能是CSIDL_BITBUCKET 回收站CSIDL_CONTROLS 控制面板CSIDL_DESKTOP Windows桌面desktop;CSIDL_DESKTOPDIRECTORY desktop的目录;CSIDL_DRIVES 我的电脑CSIDL_FONTS 字体目录CSIDL_NETHOOD 网上邻居CSIDL_NETWORK 网上邻居virtual folderCSIDL_PERSONAL 我的文档CSIDL_PRINTERS 打印机CSIDL_PROGRAMS 程序组CSIDL_RECENT 最近打开文档CSIDL_SENDTO 发送到菜单项CSIDL_STARTMENU 快速启动菜单CSIDL_STARTUP 启动目录CSIDL_TEMPLATES 临时文档第三个参数表示一个条目标识符列表指针,可以传入一个LPITEMIDLIST类型变量,再从这个变量中得到表示路径的字符串。使用完后,要用void CoTaskMemFree(void * pv)来释放资源。第二个函数 将一个条目标识符列表转换为一个文件系统路径1. BOOL SHGetPathFromIDList( 2.3. PCIDLIST_ABSOLUTE pidl, LPTSTR pszPath 4.5. ); 第一个参数 pidl就是用第一个函数所得到的条目标识符列表指针。第二个参数pszPath返回表示路径的字符串。这二个函数的头文件均为并要引入shell32.lib。下面给出了一个程序,用来列举你电脑上一些系统特殊路径:1. #include 2.3. #include 4.5. #include 6.7. #pragma comment(lib, shell32.lib) 8.9.10.11. int main() 12.13. 14.15. const int ENDNUMBER = -1;/哨兵,在遍历数组时遇到此数表示已经到达了数组的最后。 16.17. /设置这个后,你可以在nFolders数组中任意添加删除数据而不用在遍历数组时考虑其中有多少个数据。 18.19.20.21. CoInitialize(NULL); 22.23. int nFolders = 24.25. CSIDL_BITBUCKET, CSIDL_CONTROLS, CSIDL_DESKTOP, CSIDL_DESKTOPDIRECTORY, 26.27. CSIDL_DRIVES, CSIDL_FONTS, CSIDL_NETHOOD, CSIDL_NETWORK, CSIDL_PERSONAL, 28.29. CSIDL_PRINTERS, CSIDL_PROGRAMS, CSIDL_RECENT, CSIDL_SENDTO, CSIDL_STARTMENU, 30.31. CSIDL_STARTUP, CSIDL_TEMPLATES, ENDNUMBER 32.33. ; 34.35.36.37. HRESULT hr; 38.39. LPITEMIDLIST ppidl; 40.41. char szPathMAX_PATH; 42.43.44.45. int i = 0; 46.47. while (nFoldersi != ENDNUMBER) 48.49. 50.51. hr = SHGetSpecialFolderLocation(NULL, nFoldersi, &ppidl); 52.53. if (hr != S_OK) 54.55. 56.57. printf(SHGetSpecialFolderLocation Errorn); 58.59. 60.61. else 62.63. 64.65. if (SHGetPathFromIDList(ppidl, szPath) 66.67. printf(%sn, szPath); 68.69. else 70.71. printf(SHGetPathFromIDList Errorn); 72.73. CoTaskMemFree(ppidl); 74.75. 76.77.78.79. i+; 80.81. 82.83. CoUninitialize(); 84.85. return 0; 86.87. 由于系统的差异,有时会输出“SHGetPathFromIDList Error”,在我电脑上就输出了5次。有了这个例子,相信不难写出得到桌面桌面(CSIDL_DESKTOP),快速启动(CSIDL_APPDATA),程序组(CSIDL_PROGRAMS)的路径函数。不过要稍稍注意下快捷启动,要再加上MicrosoftInternet ExplorerQuick Launch。二创建快捷方式文件完成第一步的任务后接下来的问题是如何创建快捷方式文件即.lnk文件。首先要了解快捷方式文件要设置什么,然后了了解怎样设置。2.1快捷方式文件有哪些要设置的内容下面给出了Spy+和Kmplayer Plus二个程序的快捷方式。快捷方式必须设置目标,起始位置,快捷键,备注都可以选择性的设置,运行方式一般取默认值-常规窗口。2.2如何设置快捷方式文件的内容这要用到二个COM接口IShellLink和IPersistFile。由于篇幅问题,这里只讲解二个接口的部分函数。IShellLink的部分函数HRESULT SetPath(LPCTSTR pszFile); 设置目标HRESULT SetWorkingDirectory(LPCTSTR pszDir); 设置起始位置HRESULT SetHotkey(WORD wHotkey); 设置快捷键HRESULT SetShowCmd(int iShowCmd); 设置运行方式有三种选择SW_SHOWNORMAL常规窗口SW_SHOWMAXIMIZED最大化SW_SHOWMINNOACTIVE最小化HRESULT SetDescription(LPCTSTR pszName); 设置备注要特别说下SetHotkey()中的参数WORD wHotkey。MSDN上对其的解释为:The address of the hot key. The virtual key code is in the low-order byte, and the modifier flags are in the high-order byte. The modifier flags can be a combination of the following values.HOTKEYF_ALT ALT keyHOTKEYF_CONTROL CTRL keyHOTKEYF_EXT Extended keyHOTKEYF_SHIFT SHIFT key意思就是对这个WORD值,低位上是virtual key code,高位上可以是ALT,CTRL等组合键。可以用MAKEWORD(low, high)来生成一个WORD,如Ctrl+F12可以用MAKEWORD(VK_F12, HOTKEYF_CONTROL)表示。IPersistFile的部分函数HRESULT Save( 保存快捷方式LPCOLESTR pszFileName, BOOL fRemember);第一个参数是要保存文件的文件名,要求是绝对路径。第二个参数涉及COM的持续性问题(注1),一般传入TRUE即可。要创建COM对象可以用CoCreateInstance()函数(见注2)和QueryInterface()函数(见注3)。下面给出了创建的代码:IShellLink *pLink; /IShellLink对象指针IPersistFile *ppf; /IPersisFil对象指针创建IShellLink实例CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void*)&pLink);从IShellLink对象中获取IPersistFile接口pLink-QueryInterface(IID_IPersistFile, (void*)&ppf);创建之后就可以对pLink设置目标,快捷键,备注等,设置完后再用ppf创建快捷方式文件就可以了。当然最后要记得释放资源,pLink-Release(); ppf-Release()。三已封装好的函数代码下面给出封装好的函数代码,可以在程序中直接使用(在XP+VC6.0下测试过)。cpp view plaincopyprint?1. /得到当前桌面路径 2.3. BOOL GetDesktopPath(char *pszDesktopPath) 4.5. 6.7. LPITEMIDLIST ppidl = NULL; 8.9.10.11. if (SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &ppidl) = S_OK) 12.13. 14.15. BOOL flag = SHGetPathFromIDList(ppidl, pszDesktopPath); 16.17. CoTaskMemFree(ppidl); 18.19. return flag; 20.21. 22.23.24.25. return FALSE; 26.27. 28.29. /得到快速启动栏的路径 30.31. BOOL GetIEQuickLaunchPath(char *pszIEQueickLaunchPath) 32.33. 34.35. LPITEMIDLIST ppidl; 36.37.38.39. if (SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &ppidl) = S_OK) 40.41. 42.43. BOOL flag = SHGetPathFromIDList(ppidl, pszIEQueickLaunchPath); 44.45. strcat(pszIEQueickLaunchPath, MicrosoftInternet ExplorerQuick Launch); 46.47. CoTaskMemFree(ppidl); 48.49. return flag; 50.51. 52.53.54.55. return FALSE; 56.57. 58.59. /得到 开始-程序组 的路径 60.61. BOOL GetProgramsPath(char *pszProgramsPath) 62.63. 64.65. LPITEMIDLIST ppidl; 66.67.68.69. if (SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &ppidl) = S_OK) 70.71. 72.73. BOOL flag = SHGetPathFromIDList(ppidl, pszProgramsPath); 74.75. CoTaskMemFree(ppidl); 76.77. return flag; 78.79. 80.81.82.83. return FALSE; 84.85. 86.87. /* 88.89. 函数功能:对指定文件在指定的目录下创建其快捷方式 90.91. 函数参数: 92.93. lpszFileName 指定文件,为NULL表示当前进程的EXE文件。 94.95. lpszLnkFileDir 指定目录,不能为NULL。 96.97. lpszLnkFileName 快捷方式名称,为NULL表示EXE文件名。 98.99. wHotkey 为0表示不设置快捷键 100.101. pszDescription 备注 102.103. iShowCmd 运行方式,默认为常规窗口 104.105. */ 106.107. BOOL CreateFileShortcut(LPCSTR lpszFileName, LPCSTR lpszLnkFileDir, LPCSTR lpszLnkFileName, LPCSTR lpszWorkDir, WORD wHotkey,LPCTSTR lpszDescription, int iShowCmd = SW_SHOWNORMAL) 108.109. 110.111. if (lpszLnkFileDir = NULL) 112.113. return FALSE; 114.115.116.117. HRESULT hr; 118.119. IShellLink *pLink; /IShellLink对象指针 120.121. IPersistFile *ppf; /IPersisFil对象指针 122.123.124.125. /创建IShellLink对象 126.127. hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void*)&pLink); 128.129. if (FAILED(hr) 130.131. return FALSE; 132.133.134.135. /从IShellLink对象中获取IPersistFile接口 136.137. hr = pLink-QueryInterface(IID_IPersistFile, (void*)&ppf); 138.139. if (FAILED(hr) 140.141. 142.143. pLink-Release(); 144.145. return FALSE; 146.147. 148.149.150.151. /目标 152.153. if (lpszFileName = NULL) 154.155. pLink-SetPath(_pgmptr); 156.157. else 158.159. pLink-SetPath(lpszFileName); 160.161.162.163. /工作目录 164.165. if (lpszWorkDir != NULL) 166.167. pLink-SetPath(lpszWorkDir); 168.169.170.171. /快捷键 172.173. if (wHotkey != 0) 174.175. pLink-SetHotkey(wHotkey); 176.177.178.179. /备注 180.181. if (lpszDescription != NULL) 182.183. pLink-SetDescription(lpszDescription); 184.185.186.187. /显示方式 188.189. pLink-SetShowCmd(iShowCmd); 190.191.192.193.194.195. /快捷方式的路径 + 名称 196.197. char szBufferMAX_PATH; 198.199. if (lpszLnkFileName != NULL) /指定了快捷方式的名称 200.201. sprintf(szBuffer, %s%s, lpszLnkFileDir, lpszLnkFileName); 202.203. else 204.205. 206.207. /没有指定名称,就从取指定文件的文件名作为快捷方式名称。 208.209. char *pstr; 210.211. if (lpszFileName != NULL) 212.213. pstr = strrchr(lpszFileName, ); 214.215. else 216.217. pstr = strrchr(_pgmptr, ); 218.219.220.221. if (pstr = NULL) 222.223. 224.225. ppf-Release(); 226.227. pLink-Release(); 228.229. return FALSE; 230.231. 232.233. /注意后缀名要从.exe改为.lnk 234.235. sprintf(szBuffer, %s%s, lpszLnkFileDir, ps
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年初识火电运行值班员工作职责与考试要点解析
- 阳光版小学一班级下册 跳跃类游戏
- 【教案版】小学一班级上册 跳绳
- 17水平二技巧《前滚翻1》教案
- 2025年农村水源保护及治理工作面试题集及答案解析
- 2025年软件测试工程师技能进阶教程及实战经验
- 2025年网络安全工程师专业模拟题与答案解析
- 电信运营行业知识培训课件
- 2025年炼钢原理及实践应用面试题解析
- 2025年高级营养师专业能力提升考试模拟题与答案解析
- 高层建筑火灾扑救
- 香港中文大学博士英文复试模板
- 南京大学介绍
- DL-T-255-2012燃煤电厂能耗状况评价技术规范
- 【视频号运营】视频号运营108招
- 青少年运动员运动损伤的预防和处理
- 幼儿园拍摄技巧培训
- (正式版)JBT 14682-2024 多关节机器人用伺服电动机技术规范
- 村社区干部任职培训课件
- 2024年个人车位使用权转让协议书(通用)-(含多款)
- 《北京传统美食》课件
评论
0/150
提交评论