Windows Api如何创建一个快捷方式并且在开始菜单搜索到自己的应用

news/2024/9/22 23:21:14

 原文链接:http://cshelloworld.com/home/detail/1804473083243925504

当我们点击win10系统搜索框的时候,输入名称 ,win10会帮助我们匹配到对应的应用。这里搜索框实际上就是windows系统的开始菜单。

接下来我们随便找一个应用,右键,然后点击 打开文件位置,我们来看下这个EveryThing的具体位置。

我们会看到搜索框中看到的EveryThing是一个快捷方式,统一存放在系统的开始菜单目录下,

windows系统的开始菜单有两个:一个是全局的开始菜单,位于C:\ProgramData\Microsoft\Windows\Start Menu\Programs 目录下。

另一个是针对每个用户有一个单独的开始菜单,位于C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs 目录下。

如果想在搜索框中看到我们自己的应用,可以直接我们自己exe应用的快捷方式复制到系统的开始菜单目录下,就可以在搜索框中搜索到我们自己的应用了。

但是通过手动方式将快捷方式复制到系统开始菜单目录下,只是普通用户的做法,今天这篇文章,我们通过win32 api来演示一下如何创建一个快捷方式。

以下代码基本是从MSDN是复制过来并且做了一部分修改,具体可以参考MSDN的地址:https://learn.microsoft.com/en-us/windows/win32/shell/links

#include <iostream>
#include "windows.h"
#include "winnls.h"
#include "shobjidl.h"
#include "objbase.h"
#include "objidl.h"
#include "shlguid.h"
#include "ShlObj.h"
HRESULT CreateLink(LPCWSTR lpszPathObj, LPCWSTR lpszPathLink, LPCWSTR lpszDesc)
{CoInitialize(NULL);HRESULT hres;IShellLink* psl;hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);if (SUCCEEDED(hres)){IPersistFile* ppf;psl->SetPath(lpszPathObj);psl->SetDescription(lpszDesc);hres = psl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);if (SUCCEEDED(hres)){hres = ppf->Save(lpszPathLink, TRUE);ppf->Release();}psl->Release();}CoUninitialize();return hres;
}

windows api创建快捷方式是通过COM组件的方式创建的,上述代码声明了一个C++函数CreateLink,函数中有几个比较重要的Windows Api依次和大家说明一下。

1、CoInitialize(NULL); 初始化COM组件,这是调用COM组件必须要执行的函数。

2、CoCreateInstance 实例化一个具体的COM组件,参数CLSID_ShellLink可以理解为要实例化的COM组件的唯一Id。

3、QueryInterface 获取到COM组件的接口,这个接口由COM组件提供,不同的COM组件接口不同,但都是调用QueryInterface函数统一获取到COM组件接口,接口以指针的形式返回,上述代码中返回的接口为IPersistFile* ppf

4、ppf->Save调用COM组件提供的函数,在本示例中,Save函数指的是在指定位置创建一个快捷方式。

5、ppf->Release()COM组件计数器减1,这个是COM组件调用必须的操作。

6、CoUninitialize() 释放COM组件,和第一个函数CoInitialize(NULL);必须同时出现。

有了上面这个创建快捷方式的函数,我们来调用一下这个函数。如下代码是为d:\7z2404-x64.exe这个应用程序创建一个快捷方式。SHGetKnownFolderPath函数是win32的一个标准函数,用于获取windows系统中各种系统默认的路径,SHGetKnownFolderPath的第一个参数是个枚举,表示我们要获取的目录类型,也就是你想获取什么目录,是系统的桌面路径、下载路径、图片路径还是什么路径。具体看一参考MSDN的说明:https://learn.microsoft.com/zh-cn/windows/win32/shell/knownfolderid

如下代码中传入的参数FOLDERID_Desktop表示桌面,也就是说我们会把快捷方式创建在桌面。FOLDERID_CommonPrograms表示系统的开始菜单目录。

int main()
{LPCWSTR lpszPathObj = L"d:\\7z2404-x64.exe";//源路径//设置快捷方式路径PWSTR path = NULL;SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, &path);std::wstring lnkPath(path);lnkPath.append(L"\\7z2404-x64.lnk");CreateLink(lpszPathObj, lnkPath.c_str(), L"desc");
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/46921.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

解决 Xshell 无法使用 zsh 的 prompt style

为了更好的阅读体验,请点击这里 先学习一下 zsh 的配置吧~ 参考资料 从 0 开始:教你如何配置 zsh powerlevel10k 如何给 Xshell 配置呢 当我安装完 oh-my-zsh、powerlevel10k、fast-syntax-highlighting、以及若干(powerlevel10k 官方推荐)字体后,发现 powerlevel10k 的 r…

部署web应用用什么

图 fastapi 一般用Uvicorn

MySQL-14.MySQL事务日志

C-14.MySQL事务日志 事务有4种特性:原子性,一致性,隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢?事务的隔离性由锁机制实现。 事务的原子性,一致性和持久性由事务的redo日志和undo日志来保证。REDO LOG称为重做日志,提供再写入操作,恢复提交事务修改的页…

创新实训(八)——题目相关的逻辑处理解释

题目部分 题目是整个OJ系统的练习基础,无论是平时学生的练习还是比赛时的准备用题,题目系统在OJ中都是至关重要的。在controllers文件夹下,负责题目部分的代码文件分别为:problem_set.php,problem.php,problem_statistics.php,problem_data_manage.php,problem_statement_m…

创新实训(10)- 大模型服务进一步完善邮件服务

之前为应付中期检查简单接入了一个基础服务,并未对 prompt 词等做太深入的细分,为了实现更人性化的效果,我对大模型的服务进行了更进一步的完善 首先是前端的效果: 超级用户端:一般用户端:三个按钮分别对应 AI 整理格式,AI 基础纠错,AI 结合题目和代码详细检查错误。 前…

多面体

这个triangles的八个数组什么意思看不懂啊

模拟集成电路设计系列博客——7.3.1 并联比较型ADC基本介绍

7.3.1 并联比较型ADC基本介绍 并联比较型ADC(后续都称作Flash ADC)是实现超高速转换器的标准方式。Flash ADC的输入信号被并行的馈入\(2^N\)个比较器中,如下图所示:每个比较器被连接到电阻串的节点上。任何连接到电阻串节点的比较器,如果\(V_{ri}\)大于\(V_{in}\)有着1的输…

创新实训(7)- 大模型服务进一步完善

之前为应付中期检查简单接入了一个基础服务,并未对 prompt 词等做太深入的细分,为了实现更人性化的效果,我对大模型的服务进行了更进一步的完善 首先是前端的效果: 超级用户端:一般用户端:三个按钮分别对应 AI 整理格式,AI 基础纠错,AI 结合题目和代码详细检查错误。 前…