ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:66.88KB ,
资源ID:7646562      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7646562.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VC 为程序创建快捷方式的详细讲解.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VC 为程序创建快捷方式的详细讲解.docx

1、VC 为程序创建快捷方式的详细讲解VC 为程序创建快捷方式的详细讲解 有时候,为了方便用户使用我们编写的程序,需要在桌面,快速启动或程序组中创建程序的快捷方式。下面就介绍在VC下如何为程序创建快捷方式。 一得到桌面,快速启动或程序组的路径这里介绍二个win32 API函数来完成这个任务。第一个函数 获得系统特殊路径 1. HRESULT SHGetSpecialFolderLocation( 2. 3. HWND hwndOwner, int nFolder, PIDLIST_ABSOLUTE *ppidl 4. 5. ); 第一个参数表示所有者窗口句柄,一般传入NULL就可以了。第二个参数要

2、示是一个整数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_SENDT

3、O 发送到菜单项CSIDL_STARTMENU 快速启动菜单CSIDL_STARTUP 启动目录CSIDL_TEMPLATES 临时文档第三个参数表示一个条目标识符列表指针,可以传入一个LPITEMIDLIST类型变量,再从这个变量中得到表示路径的字符串。使用完后,要用void CoTaskMemFree(void * pv)来释放资源。第二个函数 将一个条目标识符列表转换为一个文件系统路径1. BOOL SHGetPathFromIDList( 2. 3. PCIDLIST_ABSOLUTE pidl, LPTSTR pszPath 4. 5. ); 第一个参数 pidl就是用第一个函数所得

4、到的条目标识符列表指针。第二个参数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数组中任意添加删

5、除数据而不用在遍历数组时考虑其中有多少个数据。 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, CS

6、IDL_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, nFolde

7、rsi, &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.

8、 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。二创建快捷方式文件完成第一步的任务后接下来的问题是如何创建快捷方式文

9、件即.lnk文件。首先要了解快捷方式文件要设置什么,然后了了解怎样设置。2.1快捷方式文件有哪些要设置的内容下面给出了Spy+和Kmplayer Plus二个程序的快捷方式。快捷方式必须设置目标,起始位置,快捷键,备注都可以选择性的设置,运行方式一般取默认值-常规窗口。2.2如何设置快捷方式文件的内容这要用到二个COM接口IShellLink和IPersistFile。由于篇幅问题,这里只讲解二个接口的部分函数。IShellLink的部分函数HRESULT SetPath(LPCTSTR pszFile); 设置目标HRESULT SetWorkingDirectory(LPCTSTR psz

10、Dir); 设置起始位置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

11、 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)来生成

12、一个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对象指针IPersis

13、tFile *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

14、()。三已封装好的函数代码下面给出封装好的函数代码,可以在程序中直接使用(在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 = SHGetPathFromI

15、DList(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, C

16、SIDL_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. /得到 开始-

17、程序组 的路径 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 f

18、lag; 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

19、. 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; 11

20、4. 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.

21、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. p

22、Link-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. i

23、f (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%

24、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.

25、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, pstr); 236. 237. int nLen = strlen(szBuffer); 238. 239. szBuffernLen - 3 = l; 240. 241. szBuffernLen - 2 = n; 242. 243. szBuffernLen -

26、1 = k; 244. 245. 246. 247. /保存快捷方式到指定目录下 248. 249. WCHAR wszMAX_PATH; /定义Unicode字符串 250. 251. MultiByteToWideChar(CP_ACP, 0, szBuffer, -1, wsz, MAX_PATH); 252. 253. 254. 255. hr = ppf-Save(wsz, TRUE); 256. 257. 258. 259. ppf-Release(); 260. 261. pLink-Release(); 262. 263. return SUCCEEDED(hr); 264.

27、265. 调用如下例:1. int main() 2. 3. 4. 5. char szPathMAX_PATH; 6. 7. CoInitialize(NULL); 8. 9. 10. 11. GetDesktopPath(szPath); 12. 13. if (CreateFileShortcut(NULL, szPath, NULL, NULL, MAKEWORD(VK_F12, HOTKEYF_CONTROL), That is a test) 14. 15. printf(创建成功n); 16. 17. 18. 19. CoUninitialize(); 20. 21. return 0; 22. 23. 头文件及引用库:1. #include 2. #include 3. #include 4. #pragma comment(lib, shell32.lib)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1