windows 快捷方式的常见扩展名是.lnk,通常情况下是不显示此扩展名的。快捷方式无法直接编辑, 如果把快捷方式拖动到记事本中,看到的也会是乱码。特别是一些快捷方式,甚至无法通过右键属性修改。
[
如上图,箭头所示部分是无法修改编辑的. 那么这些快捷方式到底是如何生成的,基本原理又是什么呢?
- 对于windows系统来说, 快捷方式是一个Shell链接文件,扩展名未必一定是.lnk,主要看在系统注册表中是否有"isShortCut"的描述.
- 快捷方式文件本身不会再有快捷方式. 也就是说你不能给快捷方式创建快捷方式.
- 应用程序要生成一个快捷方式,就需要用到一个 IShellLink 的 COM 接口.使用此接口可以对快捷方式进行操作,比如指定快捷方式的图标,快捷键,指向的文件等等.
IShellLink 接口给应用程序的能力
1. 所指向的对象的路径
Shell 链接文件的位置和它所指向的对象的位置完全独立,没有依赖关系。Shell 链接文件所指向的文件对象可以位于桌面或名字空间中的任何地方。
在应用程序中:
- 调用
IShellLink::GetPath获取所指向对象的路径。 - 调用
IShellLink::SetPath设置所指向对象的路径和文件名。
2. 所指向的对象的工作路径
Shell 链接文件中存有相应对象的工作路径信息。工作路径指当用户没有特别指定时,Shell 装载相应对象和存储文件的目录。
在应用程序中:
- 调用
IShellLink::GetWorkingDirectory获取所指向对象的工作路径。 - 调用
IShellLink::SetWorkingDirectory设置所指向对象的工作路径。
3. Shell 链接的描述字符串
创建 Shell 链接时需提供一个描述字符串,便于了解其作用(通常为“xxx 的快捷方式”)。
在应用程序中:
- 调用
IShellLink::GetDescription获取 Shell 链接的描述字符串。 - 调用
IShellLink::SetDescription设置 Shell 链接的描述字符串。
4. Shell 链接的热键
Shell 链接对象可以有一个相关联的热键。当用户按下某些特定组合键时,系统会激活该 Shell 链接。
在应用程序中:
- 调用
IShellLink::GetHotKey获取 Shell 链接的热键。 - 调用
IShellLink::SetHotKey设置 Shell 链接的热键。
5. Shell 链接所使用的图标
Shell 链接有自己的图标。用户通过双击图标访问相应对象。系统会在原对象图标的左下角加上一个系统定义的链接覆盖图标(通常是一个小箭头)来生成 Shell 链接图标。
在应用程序中:
- 调用
IShellLink::GetIconLocation获取所使用的图标路径。 - 调用
IShellLink::SetIconLocation设置所使用的图标路径。
6. 发送给所指向对象的初始化显示命令
用户激活 Shell 链接(通常通过鼠标双击)时,系统会启动相应对象的应用程序,并根据 Shell 链接指定的显示命令设置应用程序的初始显示状态(正常化、最大化、最小化)。
在应用程序中:
- 调用
IShellLink::GetShowCmd获取 Shell 链接的显示命令。 - 调用
IShellLink::SetShowCmd设置 Shell 链接的显示命令。
7. 发送给所指向对象的命令行参数
Shell 链接在被激活时还会向所指向的对象发送存储的命令行参数。当应用程序(如链接程序或编译程序)需要特殊选项参数时,设置命令行参数很有用。
在应用程序中:
- 调用
IShellLink::GetArguments获取 Shell 链接存储的命令行参数。 - 调用
IShellLink::SetArguments设置相应的命令行参数。
在应用程序中使用IShellLink接口时需要注意,在建立和转化Shell链接之前,需先通过调用Colnitialize函数初始化组件对象库。事实上,使用任何的COM接口都需要首先进行组件对象库的初始化,而且每一个对Coinitialize函数的调用需要有一个相应的CoUninitialize函数调用,后一函数是在应用程序终止时调用的。对CoUninitialize函数的调用可保证在应用程序收到它所有待决的消息后才会终止.