windows程序启动快捷方式探究

本文详细介绍了Windows中的快捷方式概念,为何需要快捷方式,快捷方式的创建、使用、位置以及如何修改。此外,探讨了快捷方式属性修改滞后的原因,涉及Shell链接、IShellLink/IPersistFile等技术。
摘要由CSDN通过智能技术生成


我们平时在安装软件的时候,一般都会下载一个安装包,直接运行安装,在安装完成后,首先我们能够在菜单栏找到刚刚安装的程序,可以点击快速运行。除此之外一般程序安装的时候都会自动创建一个桌面快捷方式,也可以方便我们快速启动程序。同样的我们还能够右键程序选择固定到开始菜单或者任务栏,我们就来探究一下这些方式的区别和作用方式。
其实无论是菜单栏中还是桌面上亦或是任务栏中的开启启动方式都是使用程序的快捷方式,只是将快捷方式存放的位置不同,因此我们首先探究快捷方式是什么,是如何快速启动软件的。
==快捷方式==
!!什么是快捷方式?!!
Windows:Shell 链接是一个数据对象,其中包含用于访问 Shell 命名空间中的另一个对象(即通过 Windows 资源管理器可见的任何对象)的信息。 可通过 Shell 链接访问的对象类型包括文件、文件夹、磁盘驱动器和打印机。 Shell 链接允许用户或应用程序从命名空间中的任意位置访问对象。 用户或应用程序不需要知道对象的当前名称和位置。
百度百科:快捷方式是Windows提供的一种快速启动程序、打开文件或文件夹的方法。它是应用程序或文件夹、文件的快速链接

!!为什么需要快捷方式?!!
对于大部分程序来说,程序的运行都需要众多文件的组成,我们可以打开任意一个安装过的程序的安装文件夹,可以看到基本都会包含很多exe或者dll文件,这是因为一个程序可能包含有主程序和次要程序,在用户用不到次要程序的时候就不会启动相关文件,减小运行内存,还有常见的为了实现模块化、减少代码量而创建的dll动态库。在启动主程序后,需要按照相对位置寻找相对的文件,因此要保证文件的相对位置。假如没有快捷方式,那么启动一个程序,我们就要一级一级的寻找主程序去启动程序,而如果仅仅将主程序移到桌面或者其他地方程序也会运行失败,使用起来极其的不便利。而快捷方式相当于一个指针,指向了需要启动的文件,而快捷方式的位置是可以随意移动的,且本身占用空间较小,一般为几k,非常方便用户的统一管理以及编辑。

!!如何使用快捷方式!!
快捷方式的最普遍使用方式是通过右键快捷方式属性设置其相关内容。
我们先从已创建的快捷方式入手。我们找到快捷方式文件位置后会发现,快捷方式是一个以程序名称命名的文件,但是却不显示文件类型后缀,文件类型描述为“快捷方式”,打开快捷方式属性面板,可以看到文件类型为“.lnk"类型。在微软的开发者文档中,快捷方式有另外一个更准确的表述:Shell Links,可翻译为壳层链接。这个名称更趋近于它的本质:用于 Windows 壳层(Shell)的链接文件。Windows 图形壳层自然是资源管理器(explorer.exe),这是它赖以工作的进程;而「链接」则说明 Shell Links 是指向引用对象(corresponding object)的文件而并非对象本身。
以桌面上的 Firefox.lnk 为例,当我们双击此链接,资源管理器发现用户尝试打开的文件类型为快捷方式,便读取了它的「目标」属性的内容 C:\Program Files\Mozilla Firefox\firefox.exe,然后尝试打开此「目标」,Firefox 程序于是被唤起了。
这和我们在资源管理器地址栏输入 Firefox.exe 位置的原理和效果是类似的。


==快捷方式位置==
=== 1、开始菜单快捷方式===
我们点击开始菜单时,会显示我们安装的文件以及一下文件夹,Windows一般有两个开始菜单文件夹。
- C:\ProgramData\Microsoft\Windows\Start Menu\Programs
- C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
两者均能调整开始菜单中的内容,但存在权限上的区别,
位置:C:\ProgramData\Microsoft\Windows\Start Menu\Programs,为系统文件夹,适用于当前本地账户与电脑中其他的本地账户;(全部账户)
位置:C:\Users\UserName\AppData\Roaming\Microsoft\Windows\Start Menu\Programs,为系统账户文件夹,仅适用于当前本地账户;(仅当前登陆账户)
文件夹内包含各种快捷方式和文件夹
其中固定到开始屏幕和任务栏的快捷方式文件都是使用的开始菜单的快捷方式,只是展示位置不同。

===2、桌面快捷方式===
同样的桌面快捷方式也是统一管理的
位于C:\Users\Public\Desktop文件夹下。

==新建快捷方式==
===1、通过已有程序新建快捷方式===
1、简单的创建快捷方式就是右键程序发送到桌面快捷方式。
2、桌面右键新建快捷方式,指定快捷方式指向目标与快捷方式名称
===2、通过代码创建方式===
在通过已有对象创建快捷方式时,必须要对象存在才能创建。而通过代码则没有这个要求,创建时可以指向任何对象,即使对象不存在(打开时会提示找不到对象)
通过代码有两种方式创建:通过IShellLink和IPersistFile
首先介绍使用IShellLink和IPersistFile创建快捷方式,IShellLink和IPersistFile是一种COM组件,通过windows的API接口调用。
1)其中IPersistFile的作用是保存或读取文件(快捷方式文件),主要用到的函数为Save()和Load()。
2)IShellLink用来获取和设置参数到快捷方式。
|GetArguments|获得参数信息|
|GetDescription|获得描述信息(备注行)|
|GetHotkey|获得快捷键|
|GetIconLocation|获得图标 |
|GetIDList|获得快捷方式的目标对象的item identifier list (Windows外壳中的每个对象如文件,目录和打印机等都有唯一的item identifiler list)|
|GetPath|获得快捷方式的目标文件或目录的全路径|
|GetShowCmd|获得快捷方式的运行方式,比如常规窗口,最大化|
|GetWorkingDirectory|获得工作目录|
|Resolve|按照一定的搜索规则试图获得目标对象,即使目标对象已经被删除或移动,重命名|
|SetArguments|设置参数信息|
|SetDescription|设置描述信息|
|SetHotkey|设置快捷键|
|SetIconLocation|设置图标|
|SetIDList|获得快捷方式的目标对象的item identifier list|
|SetPath|设置快捷方式目标文件路径|
|SetRelativePat|设置起始位置|
|SetShowCmd|设置快捷方式运行方式|
|SetWorkingDirectory|设置快捷方式工作目录|
代码示例:快捷方式打开文件夹
```
lang=C,lines = 32
#include <windows.h>
#include <assert.h>
#include <iostream>
#include <shellapi.h>
#include <shlobj.h>
#include <tchar.h>
#pragma comment(lib, "shell32.lib")

bool createLinkFile(const wchar_t *application,   // 快捷方式指向的对象
                      const wchar_t *argvs,       // 传进程序的参数
                      const wchar_t *link,        // 快捷方式的路径
                      const wchar_t *icon)        // 快捷方式的图标
{
  bool result = false;
  HRESULT hr = CoInitialize(NULL);
  if (SUCCEEDED(hr)) {
    IShellLink *shellLink = NULL;
    hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
                          IID_IShellLink, (void **)&shellLink);
    if (SUCCEEDED(hr)) {
      // 设置程序路径
      hr = shellLink->SetPath(application);

      wchar_t t[0x100]{0};
      wcscpy_s(t, application);
      wchar_t *p = wcsrchr(t, L'\\');
      p[1] = 0;

      // 设置工作目录
      hr = shellLink->SetWorkingDirectory(t);

      // 设置参数
      hr = shellLink->SetArguments(argvs);

      // 设置图标
      hr = shellLink->SetIconLocation(icon, 0);

      //设置快捷键
      hr = shellLink->SetHotkey(WORD(1601)); 
      //Ctrl + Alt + A  16位的值,低阶字节的8位设置为一个键,高阶字节的8位由3个可能的修饰符按位组合而成。 例:((2|1)<< 8 | 61)(Control | Alt | A)

      IPersistFile *persistFile = NULL;
      hr = shellLink->QueryInterface(IID_IPersistFile, (void **)&persistFile);
      if (SUCCEEDED(hr)) {
        // 创建快捷方式
        hr = persistFile->Save((link), FALSE);
        if (SUCCEEDED(hr))
          result = true;

        persistFile->Release();
      }
      shellLink->Release();
    }
    CoUninitialize();
  }

  return result;
}
int main() {
  //定位桌面路径
  LPITEMIDLIST lp{0};
  HRESULT result = SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &lp);
  if (SUCCEEDED(result)) {
    // 转化为字符串
    wchar_t name[520]{0};
    if (SHGetPathFromIDListW(lp, name)) {
      // 创建桌面图标
      wcscat_s(name, L"\\TEST.lnk");
      createLinkFile(
          L"D:\\utility4.1\\SurvUtility\\SurveillanceSystem\\Release",
          L"C:\\Users", name, L"E:\\test.ico");
    }
  }

  return 0;
}
```
{F4592265}


==如何修改快捷方式==
其中最快和最方便的修改快捷方式的方法就是右键查看快捷方式的属性并对其中内容进行修改。
首先在快捷方式页面的常规tab里可以看到快捷方式的一些基本信息。其中快捷方式名称可以修改。显示文件类型、描述、位置、大小以及创建修改等时间项。
在快捷方式tab可以看到快捷方式的一些属性项。也是修改提快捷方式内容的位置。
1)目标:是快捷方式指向的文件位置,一般仅使用改参数即可确定目标文件
2)起始位置:快捷方式指向的程序和其运行需要的相关文件的文件夹,一般来说程序运行所需要的文件都在同一目录下,因此此项可以为空。
3)快捷键:可以为启动快捷方式(启动程序)指定快捷键,快速启动。快捷键不会与windows自带的快捷键冲突,会自动填充,如果使用F1...可以直接使用,其他键则会自动填充Ctrl+ Alt + 自定义键
4)运行方式:指定运行程序时是以最大化、常规窗口、最小化方式运行
5)备注:
6)打开文件所在位置:打开快捷方式目标文件所在位置
7)更改图标:修改快捷方式图标。默认指向运行程序,显示程序图标。可以选择浏览文件夹选择任意icon格式图标。
{F4578666}{F4578854}
(windows系统所用图标位置:C:\Windows\System32\SHELL32.dll)
8)高级:指定是否以管理员身份运行程序
当然也可以在代码中读取快捷方式内容,然后修改,该方式类似创建新快捷方式,在此不再赘述。

注意:
目前无论是通过右键快捷方式修改属性,或者通过代码新建快捷方式修改属性都有一定的迟滞性。
根据测试,当通过右键快捷方式修改快捷方式快捷键属性时,会存在一定延后性,当设置快捷键后再修改为其他快捷键,原快捷键仍会起作用。
而对于通过代码创建快捷方式,修改图标后不会立刻刷新图标。
二者都可以通过刷新文件管理器修复,代码如下:
```
lang=C,lines = 32
rem 关闭Windows外壳程序explorer

taskkill /f /im explorer.exe

rem 清理系统图标缓存数据库

attrib -h -s -r "%userprofile%\AppData\Local\IconCache.db"

del /f "%userprofile%\AppData\Local\IconCache.db"

attrib /s /d -h -s -r "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\*"

del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_32.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_96.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_102.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_256.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_1024.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_idx.db"
del /f "%userprofile%\AppData\Local\Microsoft\Windows\Explorer\thumbcache_sr.db"

rem 清理 系统托盘记忆的图标

echo y|reg delete "HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" /v IconStreams
echo y|reg delete "HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" /v PastIconsStream

rem 重启Windows外壳程序explorer

start explorer
```
但是该方法会重启文件管理器,造成屏幕显示异常(会黑屏一下)。

快捷方式属性修改滞后原因:
是 Windows 为了提升图标显示速度,将图标文件缓存在了 IconCache.db 文件中。一旦更新了图标或修改了源文件的位置,缓存得不到及时刷新,就会出现图标延迟的情况。

  • 44
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值