5.Window Shell编程

一、前言

Windows Shell是windows操作系统中一个非常重要的组件,它提供了用户和操作系统交互的界面。

比如资源管理器、任务栏、菜单栏、开始菜单、桌面等等,都属于Windows Shell。

而通过相关的win api,我们就能控制Windows Shell的相关行为。

比如我们最常用的一个功能,双击一个文件、系统就会使用默认应用程序去打开该文件,如果我们想要在自己程序中实现这一功能,那就需要借助Windows Shell的相关win api了。

本文主要介绍一些常用、有趣的功能,更多功能可以参考其官方文档:Windows Shell

二、默认打开文件

这个功能其实非常简单,用到了函数:ShellExecuteA

其使用方法如下:

#include<Windows.h>

int main() {
	ShellExecuteA(NULL,"open", "D:\\Desktop\\test.py",NULL,NULL,0);
}

此时由于我使用了vscode软件作为了.py文件的默认打开软件,所以当我运行上面这个命令后,就会自动使用vscode去打开这个文件。

事实上这个函数的功能并不仅仅如此,它还有很多强大的功能,这取决于它的第二个参数。

除了open外,还可以为runas,它可以用管理员权限去启动一个程序。

更多细节可以参考官方文档。

三、系统托盘

你应该常常能看到window系统右下角的那个托盘,事实上这个功能就可以调用函数Shell_NotifyIconA实现。

但这个函数使用起来还是比较复杂的,所有这里并不准备演示代码。

因为正常开发程序,我们一般都是使用现成的框架,成熟的框架都会集成这个功能,让我们可以非常方便的使用。

这个函数的主要作用就是和托盘进行交互的,比如告诉托盘添加、删除一个图标等。

四、关联程序

之所以能够双击文件后会有程序去打开,其原因就在于软件在系统中关联了指定文件后缀名。

而我们便可以通过函数FindExecutableA查询到是哪个可执行文件关联到了文件:

#include<Windows.h>
#include<iostream>
int main() {
	char buf[0xff]{};
	FindExecutableA("D:\\Desktop\\test.py", NULL, buf);
	printf("%s", buf);
}

五、回收站

回收站本质上是一个特殊的文件夹,如果你调用DeleteFile函数去删除文件就会发现,文件会被彻底删除,而不会出现在回收站内。

而想要实现删除文件时让其进入回收站,那么就可以调用函数SHFileOperationA

通过这个函数对文件进行操作、就和正常用户对文件操作是一样的,比如删除后文件会进入回收站。

除此之外你还可以使用以下函数操控回收站的相关行为:

六、特殊目录

某些目录时系统预定义的,比如安装软件的目录一般默认为C:\Program Files

这样的目录有很多,我们可以通过官方提供的函数SHGetKnownFolderPath来直接获取。

其使用方法如下:

#include<Windows.h>
#include<iostream>
#include <ShlObj_core.h>
int main() {
	wchar_t* buf;
	SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, &buf);
	wprintf(L"%s", buf);
}

重点是它的第一个参数,比如这里填写的就是桌面,更多的可选参数可以参考文章:KNOWNFOLDERID

当然你也可以通过SHSetKnownFolderPath实现给这些特殊目录换个位置。

七、更多

除了上面这些简单的用法外,更多高级的用法还会涉及到COM编程,比如你想要弹出打开、保存文件的对话框,又或者创建应用程序的快捷方式,都需要使用到COM编程。

COM编程的内容后文我会对其进行介绍。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux