一、前言
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。
通过这个函数对文件进行操作、就和正常用户对文件操作是一样的,比如删除后文件会进入回收站。
除此之外你还可以使用以下函数操控回收站的相关行为:
- SHQueryRecycleBinA:返回指定驱动器的回收站大小、以及回收站内文件数
- SHEmptyRecycleBinA:清空指定驱动器的回收站
六、特殊目录
某些目录时系统预定义的,比如安装软件的目录一般默认为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编程的内容后文我会对其进行介绍。