Windows Api如何创建一个快捷方式并且在开始菜单搜索到自己的应用
原文链接: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");
}
Windows Api如何创建一个快捷方式并且在开始菜单搜索到自己的应用的更多相关文章
- VC++ 创建一个动态增长的层叠菜单
工作中需要创建一个动态增长的层叠菜单,类似于动态增长的多语言切换菜单,也是废了好大劲哪,分享一下,请交流参考. 类似效果图: 弹出子菜单各菜单项的意义一致,用ON_COMMAND_RANGE宏来统一实 ...
- Windows API——CREATEEVENT——创建事件
事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步对象.事件告诉线程何时去执行某一给定的任务,从而使多个线程流平滑 CreateEvent是创建windows事件的意思,作用主要用在判断线 ...
- Windows API—CreateEvent—创建事件
事件是一个允许一个线程在某种情况发生时,唤醒另外一个线程的同步对象.事件告诉线程何时去执行某一给定的任务,从而使多个线程流平滑,CreateEvent是创建windows事件的意思,作用主要用在判断线 ...
- 怎么样在windows命令下创建一个没有文件名的文件?
直接上图 echo ' ' >> .aa //创建一个空字符的 .aa 的文件
- C++ API实现创建桌面快捷方式
#include<windows.h> #include <string> #include <shellapi.h> #include <shlobj.h& ...
- 在windows桌面上创建一个文件夹
用dos命令创建 md [文件路径][文件名] C:\Users\admin>md C:\Users\admin\desktop\test 刷新一下桌面,就可以看见桌面上创建了一个名为test ...
- 使用PHP创建一个REST API(译)
最近API在网络领域有些风靡,明确的说是REST的影响力.这实在没什么好惊讶的,因为在任何编程语言中,消费REST API都是非常的容易.构建它也非常的简单,因为本质上你不会用到任何那些已存在很久的H ...
- C++使用代码创建一个Windows桌面应用程序
WinMain函数 Windows应用程序的唯一程序入口. 函数原型 int WINAPI WinMain { HINSTANCE hInstancem HINSTANCE hPreInstance, ...
- c运行库、c标准库、windows API的区别和联系
C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的. API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的 ...
- (转)c运行库、c标准库、windows API的区别和联系
C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的. API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的 ...
随机推荐
- System.Text.Json匿名对象反序列化
以前就是一直使用 Newtonsoft.Json 用起来还是挺舒服的.由于 JSON 的应用越来越广,现在. NET Core 都内置了 System.Text.Json 可以直接对 JSON 进行操 ...
- 【NAS】绿联NAS UGOS PRO 使用natfrp(Sakura Frp)内网穿透访问Docker应用
配置加速 https://registry.cn-hongkong.aliyuncs.com 下载镜像 创建容器 [容器]-[创建]-[手动创建]- 选择你下载的镜像即可 在日志中查看密码 访问容器 ...
- jacoco代码覆盖率报告分析
一.目的 对Jacoco代码覆盖率统计维度.报告字段说明.报告详细分析描述.并为精准测试.健壮性测试提供指导. 二.Jacoco代码覆盖率统计维度 Jacoco是从代码指令(Instructions, ...
- Qt/C++音视频开发75-获取本地有哪些摄像头名称/Qt内置函数方式
一.前言 在需要打开本地摄像头的场景中,有个需求绕不开,那就是如何获取本地有哪些摄像头设备名称,这样可以提供下拉框给用户选择,不然你让用户去填设备名,你觉得用户会知道是啥,他会操作吗?就算你提供了详细 ...
- Qt安卓开发经验021-030
关于权限设置,在早期的安卓版本,所有权限都写在全局配置文件AndroidManifest.xml中,这种叫安装时权限,就是安装的时候告诉安卓系统当前app需要哪些权限.大概从安卓6开始,部分权限需要动 ...
- Sqlsugar 跨库查询小心得(同服务器不同数据库)
同一个服务器下的不同数据库,目前还没有进行跨服务器的查询,以后有待研究-- 1.使用的是Left Join左查询,因此连接字符串应该是写的第一个表所在的数据库的连接字符串 假设数据库A,B,连接字符串 ...
- 视频分析框架VideoPipe完整介绍
(2024年4月编写) github地址 https://github.com/sherlockchou86/video_pipe_c 作者微信 zhzhi78(备注 videopipe),拉群交流( ...
- cpa-经济法
1.法律基本原理 2.基本民事法律制度 3.物权法律制度 4.合同法律制度 5.合伙企业法律制度 6.公司法律制度 7.证券法律制度 8.企业破产法律制度 9.票据与支付计算法律制度 10.企业国有资 ...
- layui table表格单元格动态合并,并设置隔行变色
layui table表格单元格动态合并,并设置隔行变色,此代码只针对嵌套数组只有一层的时候有效,多个数组嵌套还在冥想当中!! 需求描述 我们知道在layui插件官方平台有个可以无限极单元格合并的模块 ...
- VulNyx - Mail 靶机
扫描靶机 发现22 和 80端口 访问80端口 发现id=1 和2 时都会有回显 dirsearch -u http://http://192.168.200.39 访问这个1 和 2的路径 发现竟然 ...