首页 > 系统相关 >Windows Api如何创建一个快捷方式并且在开始菜单搜索到自己的应用

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

时间:2024-06-23 17:42:58浏览次数:24  
标签:ppf 开始菜单 Windows 组件 快捷方式 include COM

 原文链接: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");
}

 

标签:ppf,开始菜单,Windows,组件,快捷方式,include,COM
From: https://www.cnblogs.com/caoruipeng/p/18263702

相关文章

  • windows服务器上用nginx转发到iis中的网站
    windows服务器上用nginx转发到iis中的网站2024年6月23日测试通过前提:华为云1核心2G内存1M带宽服务器¥40/年,还没有备案,80端口用不了,在安全组里把81端口打开了,同时记得登录云服务器里把WINDOWS的防火墙关闭或者放行81端口想法:windows服务器里下载nginxwindows版本,然后所有请求......
  • 当Windows台式电脑或笔记本电脑随机关机时,请先从这8个方面检查
    序言你的Windows笔记本电脑或PC是否意外关闭?笔记本电脑电池故障、电源线松动、过热、电源设置错误、驱动程序过时或电脑组件故障等问题都可能是罪魁祸首。如果你对这个问题感到沮丧,试试这些解决方案。进行一些初步检查与从电池中获取电力的笔记本电脑不同,台式电脑依靠与外部......
  • 玄机——第五章 Windows 实战-evtx 文件分析 wp
    文章目录一、前言二、概览简化三、参考文章四、步骤(解析)步骤#11.将黑客成功登录系统所使用的IP地址作为Flag值提交;拓展1.1步骤#22.黑客成功登录系统后修改了登录用户的用户名,将修改后的用户名作为Flag值提交;拓展1.2拓展1.3步骤#33.黑客成功登录系统后成功访问了一个......
  • CrossOver 24 for Mac(windows 虚拟机)
    CrossOverforMac是一款功能强大的虚拟机软件,允许在Mac系统上运行Windows应用程序而无需重新启动计算机。通过CrossOver,用户可以轻松地运行Windows软件和游戏,而无需购买Windows许可证或使用虚拟机。CrossOver通过直接在Mac系统上提供所需的Windows资源,实现了无缝的跨平台兼容......
  • Windows系统分区
    系统分区一,选择分区表1,MBR(主引导记录)分区表;缺陷:最大支持2.1TB的硬盘;最大支持4个主分区。分区分类:①主分区:每块硬盘最多4个②扩展分区:每块硬盘最多1个,扩展分区+主分区最多4个,扩展分区不能格式化,不能写入数据扩展分区只能用于包含更多的逻辑分区③逻辑分区:逻辑分区......
  • Windows系统分区 二
    [2]格式化原理Block(数据块):Linux默认大小4KB,还支持1KB,2KB    du统计文件大小    df统计空间大小如果一个文件需要占用多个Block,他会尽量依次存储,但不是绝对的。一个文件可以占用多个Block,但是一个Block只能保存一个文件的数据。Inode(索引节点):大小128Byte......
  • windows系统配置linux环境wsl
    前言WindowsSubsystemforLinux(WSL)是微软为Windows10和WindowsServer引入的一个特性,它允许用户在Windows操作系统上直接运行Linux环境,而不需要使用虚拟机或双启动系统。WSL的主要目的是提高开发者的生产力,特别是那些需要在Linux和Windows之间切换的开发人员。一、wsl......
  • 20240622-PowerShell5和PowerShell7在windows terminal中无法切换
    今天安装powertoys小工具commandNotFound的时候,提示要求powershell版本是7,而当前powershell版本是5,如下。但是powertoys中显示powershell7已经安装,如下图。主要问题在于powershell5的程序名是powershell.exe,而powershell7的程序名是pwsh.exe.windowsterminal每个选项卡默......
  • windows powershell 如何读取大文件前10行
    在WindowsPowerShell中,可以使用Get-Contentcmdlet来读取文件内容。对于大文件,直接使用Get-Content会加载整个文件,这可能会导致性能问题或内存溢出。为了避免这样的问题,我们可以通过指定读取的行数来获取文件的前几行。以下是一些常见的方法来读取大文件的前10行:Get-Cont......
  • windows本地运行LLama3中文版
     先到官网下载LMStudio 网址:LMStudio-Discover,download,andrunlocalLLMs下载完成后,直接点击运行。在页面搜索栏输入:llama3chines 然后收获了如下错误信息:networkerror,怎么办?请转如下链接处理,博主写的很详细LMStudioNetworkError怎么处理https://blog.cs......