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的地址:Shell Links - Win32 apps | Microsoft Learn

#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的说明:KNOWNFOLDERID (Knownfolders.h) - Win32 apps | Microsoft Learn

如下代码中传入的参数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");
}

联系站长

站长公众号

推荐阅读
  •  C#弃元表达式的用法
  •  记录一次JSON.NET反序列化带来的内存爆炸问题
  •  C#如何使用HttpClient对大文件进行断点上传和下载
  •  Windows Api如何创建一个快捷方式并且在开始菜单搜索到自己的应用
  •  .NET Core配置文件发生变更的时候,程序如何接受
  •  C#如何将文件压缩成ZIP并且实时显示压缩进度
  •  线性表
  •  顺序栈
  •  链栈
  •  数组实现队列

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

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

相关文章

Adobe XD最新2023资源百度云盘下载(附教程)

如大家所了解的&#xff0c;Adobe XD是一种基于矢量的UI和UX设计工具&#xff0c;可用于设计从智能手表应用程序到成熟网站的任何内容&#xff0c;功能非常强大且操作便捷。目前最新已推出2023版本。 Adobe XD解决了Photoshop和其他图形应用程序无法解决的两个主要问题&#xf…

LSSS算法实现,基于eigen和pbc密码库【一文搞懂LSSS,原理+代码】

文章目录 一. LSSS简介1.1 概述1.2 线性秘密分享方案&#xff08;LSSS&#xff09;与 Shamir的秘密分享方案对比LSSS1.2.1 Shamir的秘密分享方案1.2.2 线性秘密分享方案&#xff08;LSSS&#xff09;1.2.3 主要区别 二. 基于矩阵的LSSS加解密原理分析2.1 LSSS矩阵构造2.1.1 定义…

Bytebase 对接本地部署的 llama3 开启ChatSQL功能

Bytebase 是为开发人员、测试、DBA和运维工程师构建的数据库 DevOps 领域的&#xff0c;类 GitLab/GitHub 平台。 这篇文章主要关注 Bytebase SQL 编辑器中的 AI 增强功能。使用此功能您可以使用自然语言在 Bytebase SQL 编辑器中查询数据库。同时还能给出针对查询的索引建议&…

WSL+Anconda(pytorch深度学习)环境配置

动机 最近在读point cloud相关论文&#xff0c;准备拉github上相应的code跑一下&#xff0c;但是之前没有深度学习的经验&#xff0c;在配置环境方面踩了超级多的坑&#xff0c;依次来记录一下。 一开始我直接将code拉到了windows本地来运行&#xff0c;遇到了数不清的问题&a…

骑马与砍杀-战团mod制作-基础篇-武器模型入骑砍(二)

骑马与砍杀战团mod制作-基础-武器模型入骑砍笔记&#xff08;二&#xff09; 资料来源 学习的资料来源&#xff1a; b站【三啸解说】手把手教你做【骑砍】MOD&#xff0c;基础篇&#xff0c;链接为&#xff1a; https://www.bilibili.com/video/BV19x411Q7No?p4&vd_sour…

【Python】已解决:安装python-Levenshtein包时遇到的subprocess-exited-with-error问题

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例及解决方案五、注意事项 已解决&#xff1a;安装python-Levenshtein包时遇到的subprocess-exited-with-error问题 一、分析问题背景 在安装python-Levenshtein这个Python包时&#xff0c;有时会…

Applied Spatial Statistics(七):Python 中的空间回归

Applied Spatial Statistics&#xff08;七&#xff09;&#xff1a;Python 中的空间回归 本笔记本演示了如何使用 pysal 的 spreg 库拟合空间滞后模型和空间误差模型。 OLS空间误差模型空间滞后模型三种模型的比较探索滞后模型中的直接和间接影响 import numpy as np impor…

【人工智能】—XGBoost算法在构建互联网防火墙异常行为识别模型应用案例

摘要&#xff1a; 近年来&#xff0c;各地党委、政府加快推进新型工业化&#xff0c;部署实施制造强市战略&#xff0c;提出工业企业“智改数转”是推动全市工业经济稳增长的重要引擎&#xff0c;更是稳增长、促发展的重要抓手。今天博主就以互联网防火墙异常行为识别为例给大家…

js实现canvas截图功能

关键代码 使用canvas的导出功能和drawImage函数 class CropShape{cropShape(shape){let {x,y,w,h} shapeconsole.log(x,y,w,h)const roiCanvas document.createElement(canvas);document.getElementById(app).append(roiCanvas)const roiCtx roiCanvas.getContext(2d);roi…

CTO的职责是什么?

看《架构思维》作者是这样讲的&#xff1a; CTO 到底是做什么的&#xff1f; 我当下的答案是&#xff1a;“CTO 就是一个从技术视角出发&#xff0c;为公司或者所在的部门做正确决策的 CEO。”怎么理解这句话呢&#xff1f;作为一个 CTO&#xff0c;其长期目标和决策优先级与…

vscode用vue框架2,续写登陆页面逻辑,以及首页框架的搭建

目录 前言&#xff1a; 一、实现登录页信息验证逻辑 1.实现登录数据双向绑定 2.验证用户输入数据是否和默认数据相同 补充知识1&#xff1a; 知识点补充2&#xff1a; 二、首页和登录页之间的逻辑(1) 1. 修改路由&#xff0c;使得程序被访问先访问首页 知识点补充3&am…

经典机器学习方法(7)—— 卷积神经网络CNN

参考&#xff1a;《动手学深度学习》第六章 卷积神经网络&#xff08;convolutional neural network&#xff0c;CNN&#xff09;是一类针对图像数据设计的神经网络&#xff0c;它充分利用了图像数据的特点&#xff0c;具有适合图像特征提取的归纳偏置&#xff0c;因而在图像相…

信息安全基础知识(完整)

信息安全基础知识 安全策略表达模型是一种对安全需求与安全策略的抽象概念表达&#xff0c;一般分为自主访问控制模型&#xff08;HRU&#xff09;和强制访问控制模型&#xff08;BLP、Biba&#xff09;IDS基本原理是通过分析网络行为&#xff08;访问方式、访问量、与历史访问…

程序猿大战Python——面向对象——继承进阶

方法重写 目标&#xff1a;掌握方法的重写。 当父类的同名方法达不到子类的要求&#xff0c;则可以在子类中对方法进行重写。语法&#xff1a; class 父类名(object):def 方法A(self):代码... class 子类名(父类名):def 方法A(self):代码... 例如&#xff0c;一起来完成&…

Ubuntu下安装docker

一、docker安装说明 解决官方源无法下载的问题 二、使用步骤 1.更新软件包索引 sudo apt-get update2.安装必要的软件包&#xff0c;以允许apt通过HTTPS使用仓库 sudo apt-get install apt-transport-https ca-certificates curl software-properties-common3.添加Docker的…

数据结构:冒泡排序,选择排序,插入排序,希尔排序的实现分析

✨✨小新课堂开课了&#xff0c;欢迎欢迎~✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 小新的主页&#xff1a;编程版小新-CSDN博客 1.冒泡排序 1.1算法思想 冒泡排序的基本思想就是&a…

LLM端侧部署系列 | 如何将阿里千问大模型Qwen部署到手机上?环境安装及其配置(上篇)

引言 下载待部署模型 安装minconda 安装tvm和mlc-llm 安装 JDK 安装 Android SDK 下载mlc-llm仓库 设置环境变量 安装Rust 1. 引言 梨花风起正清明&#xff0c;游子寻春半出城。 小伙伴们好&#xff0c;我是公众号《小窗幽记机器学习》的小编&#xff1a;卖青团的小…

38. 外观数列

题目 「外观数列」是一个数位字符串序列&#xff0c;由递归公式定义&#xff1a; countAndSay(1) "1" countAndSay(n) 是 countAndSay(n-1) 的行程长度编码。 行程长度编码&#xff08;RLE&#xff09;是一种字符串压缩方法&#xff0c;其工作原理是通过将连续相…

刷代码随想录有感(114):动态规划——最少数量的零钱换整

题干&#xff1a; 代码&#xff1a; class Solution { public:int coinChange(vector<int>& coins, int amount) {vector<int>dp(amount 1, INT_MAX);dp[0] 0;for(int i 0; i < coins.size(); i){for(int j coins[i]; j < amount; j){if(dp[j - coi…

【Linux】系统文件IO·文件描述符fd

前言 C语言文件接口 C 语言读写文件 1.C语言写入文件 2.C语言读取文件 stdin/stdout/stderr 系统文件IO 文件描述符fd&#xff1a; 文件描述符分配规则&#xff1a; 文件描述符fd&#xff1a; 前言 我们早在C语言中学习关于如何用代码来管理文件&#xff0c;比如文件的…