有时,为了方便用户查看,我们可能需要提供在资源管理器中打开文件
的功能
比如:Qt(在Explorer中显示
)、Chrome(在文件夹中显示
)
该功能用于打开一个指定文件夹,并选中指定文件
打开文件夹
本质上和打开文件
没什么区别,说白了就是一个URL
(Uniform Resource Locator)
打开URL
,我们能想到很多种方法:
Windows API
中的ShellExecute()
函数CMD
的 start命令QDesktopServices::openUrl(const QUrl &url)
静态函数打开URL
并不是什么难事
但我们在打开文件夹
后还必须选中文件
这一点,一般的函数都做不到
究其原因
我们要明白,资源管理器
本质上是一个应用程序
即explorer.exe
我们要对应用程序
下手,最好的办法还是通过其自身的参数
所谓命令行参数,就是在启动时传递给程序的参数,用以执行不同操作
比如:传递给图片查看器图片的绝对路径
在C/C++
中
void main(int argc, char* argv[])
argv
指针数组便是命令行参数
通过这些参数,程序自身便可以进行判断,获取更多外界信息
我们可以通过CMD
或者拖拽文件传递命令行参数
test.exe argument
应用程序路径 + 空格 + 参数即可(参数间用空格分开)
明白了这些,我们只需要给explorer
传递对应参数即可选中文件
格式如下
explorer.exe /select, URL
要能非阻塞开启外部程序,并传递参数
我们大体有两种方法:
ShellExecute()
QProcess
ShellExecute
函数原型及参数含义如下:
ShellExecute(
hWnd: HWND; //{指定父窗口[句柄]}
Operation: PChar; //{指定动作, 譬如: open、runas、print、edit、explore、find}
FileName: PChar; //{指定要打开的文件或程序}
Parameters: PChar; //{给要打开的程序指定参数} <-命令行参数
Directory: PChar; //{缺省目录}
ShowCmd: Integer //{打开选项}
);
看起来复杂,但主要就是FileName
和Parameters
,举个例子便一目了然
ShellExecute(NULL, "open", "explorer", "/select, E:\test.png", NULL, SW_SHOW);//打开E:\test.png并选中
但是在实际应用中,我们还是要注意一点
大多Windows API
都分为了两个版本:W版和A版
也就是ShellExecuteW
和ShellExecuteA
区别是W代表宽字符,采用Unicode编码,A代表ASCII编码
由于文件路径
可能出现中文,所以我们采用ShellExecuteW
ShellExecuteW(NULL, L"open", L"explorer", QString("/select, \"%1\"").arg(ImagePath).toStdWString().c_str(), NULL, SW_SHOW);
L"open"
前的L
代表将"open"
转化为宽字符,否则不符合参数类型LPCWSTR
(typedef const wchar_t* LPCWSTR;
)
而QString也要相应地转化为宽字符版本
Perfect
接下来我们看看Qt特有的类-QProcess
该类可用于完成启动外部程序,并与之交互通信
但此次我们不需要通信,只要传入参数并非阻塞启动即可
QProcess process;
process.startDetached(QString("explorer /select,\"%1\"").arg(ImagePath));//启动后分离,即非阻塞
由于是Qt内部的类,所以不需要特殊处理宽字符,因为Qt一律采用Unicode编码
Windows API,你看看人家
Over
两种方法,掷硬币决定吧