windows 快捷方式深度解析

windows 快捷方式的常见扩展名是.lnk,通常情况下是不显示此扩展名的。快捷方式无法直接编辑, 如果把快捷方式拖动到记事本中,看到的也会是乱码。特别是一些快捷方式,甚至无法通过右键属性修改。

如上图,箭头所示部分是无法修改编辑的.
那么这些快捷方式到底是如何生成的,基本原理又是什么呢?

  1. 对于windows系统来说, 快捷方式是一个Shell链接文件,扩展名未必一定是.lnk,主要看在系统注册表中是否有”isShortCut”的描述.
  2. 快捷方式文件本身不会再有快捷方式. 也就是说你不能给快捷方式创建快捷方式.
  3. 应用程序要生成一个快捷方式,就需要用到一个 IShellLink 的 COM 接口.使用此接口可以对快捷方式进行操作,比如指定快捷方式的图标,快捷键,指向的文件等等.

IShellLink接口给了应用程序哪些能力:
1.所指向的对象的路径
Shell链接文件的位置和它所指向的对象的位置是完全独立的,它们之间没有任何的依赖关心,也就是说,Shell链接文件它所指向的文件对象都可以位于桌面或名字空间中的任何地方。
在应用程序中,调用IShellLink接口的GetPath成员函数可以获取它所指向的对象的路径,而使用SetPath成员函数则可以设置所指向对象的路径和文件名。
2.所指向的对象的工作路径
Shell链接文件中存有相应对象的工作路径信息,所谓工作路径,是指当用户没有特别指定时某个Shell装载相应的对象和存储文件的目录。
在应用程序中,调用IShellLink接口的GetWorkingDirectoty成员函数可以获取它所指向的对象的工作路径,而使用SetWorkingDirectoty成员函数则可以设置它所指向的对象的工作路径。
3.Shell链接的描述字符串
在创建Shell链接的时候,你需要为该链接提供一个描述字符串,这样便于了解它的作用,一般Shell链接的描述字符串被取为“xxx的快捷方式”。
在应用程序中,调用IShellLink接口的GetDescriptkm成员函数可以获取Shell链接的描述字符串,而使用SetDescription成员函数则可以设置Shell链接的描述字符串u
4.Shell链接的热键
Shell链接对象可以有一个与之相关联的热键,所谓热键,就是指当用户按下某些特定的组合键时,系统即会激活Shell链接。
在应用程序中,调用IShellLink接口的GetHotKey成员函数可以获取Shell链接的热键,而使用SetHotKey成员函数则可以设置Shell链接的热键。
5.Shell链接所使用的图标
同其他Shell对象一样,Shell链接也有其图标。用户可通过双击此Shell链接图标来访问其相应的对象。系统通过向相应对象的图标的左下角加上一个系统定义的链接覆盖图标(通常是一个小箭头)而生成Shell链接的图标。
在应用程序中,调用IShellLink接口的GetIconLocation成员函数可以获取它所使用的图标的路径,而使用SetIconLocation成员函数则可以设置它使用的图标的路径。
6.发送给所指向对象的初始化显示命令
当用户激活某个Shell链接(通常是通过鼠标双击)时,系统将启动同相应对象相关的应用程序并根据此Shell链接所指定的显示命令来设置此应用程序的初始显示状态。大家当然知道,这个初始显示状态包括正常化、最大化和最小化三种状态。
在应用程序中,调用IShellLink接口的GetShowCmd成员函数可以获取Shell链接的显示命令,而使用SetShowCmd成员函数则可以设置Shell链接的显示命令。
7.发送给所指向对象的命令行参数
除了初始化显示状态之外,Shell链接在被激活时还会向所指向的对象发送存储的命令行参数。在相应的应用程序如链接程序或编译程序,需要用到一些特殊的选项参数时,设置其命令行参数是很有用的。在应用程序中,调用IShellLink接口的GetArguments成员函数可以获取Shell链接存储的命令行参数,而使用SetArguments成员函数则可以设置相应的命令行参数。

在应用程序中使用IShellLink接口时需要注意,在建立和转化Shell链接之前,需先通过调用Colnitialize函数初始化组件对象库。事实上,使用任何的COM接口都需要首先进行组件对象库的初始化,而且每一个对Coinitialize函数的调用需要有一个相应的CoUninitialize函数调用,后一函数是在应用程序终止时调用的。对CoUninitialize函数的调用可保证在应用程序收到它所有待决的消息后才会终止.

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注