小恐龙工作室

专注效率工具与实用技巧分享

Aug 2, 2017 - 编程开发

windows 快捷方式深度解析

windows 快捷方式的常见扩展名是.lnk,通常情况下是不显示此扩展名的。快捷方式无法直接编辑, 如果把快捷方式拖动到记事本中,看到的也会是乱码。特别是一些快捷方式,甚至无法通过右键属性修改。 [ 如上图,箭头所示部分是无法修改编辑的. 那么这些快捷方式到底是如何生成的,基本原理又是什么呢?

  1. 对于windows系统来说, 快捷方式是一个Shell链接文件,扩展名未必一定是.lnk,主要看在系统注册表中是否有"isShortCut"的描述.
  2. 快捷方式文件本身不会再有快捷方式. 也就是说你不能给快捷方式创建快捷方式.
  3. 应用程序要生成一个快捷方式,就需要用到一个 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函数的调用可保证在应用程序收到它所有待决的消息后才会终止.

点此查看使用该接口的代码示例