使用ShellExecute调用默认图片查看器批量打开图片无法切换浏览的解决方法
实现多图在默认图片查看器中切换浏览的解决方案
在Windows资源管理器中选中多张图片按回车,默认图片查看器可打开并支持切换浏览,但直接用ShellExecute单开单张图片正常,用分号分隔多路径却无法实现多图切换,错误代码如下:
ShellExecute(Handle, PChar('open'), PChar(filename), PChar(''), PChar(path), SW_SHOWNORMAL);
尝试分号分隔多路径的代码也无效:
var path, filename: string; filenames: TStringList; begin path := IncludeTrailingPathDelimiter(TPath.GetTempPath); filenames := TStringList.Create; try filenames.Delimiter := ';'; ForEachSelectedRecordInGrid( DragDBGrid1, procedure begin filename := Trim(ExtractFileName(DateienQDateiname.AsString)); if (filename <> '') then begin filename := path + filename; DateienQDatei.SaveToFile(filename); filenames.Add(filename); end; end ); if (filenames.Count > 0) then ShellExecute(Handle, PChar('open'), PChar(filenames.DelimitedText), PChar(''), PChar(path), SW_SHOWNORMAL); finally filenames.Free; end; end;
问题原因
ShellExecute的lpFile参数不支持分号分隔的多文件路径,该参数仅识别单个文件,且默认图片查看器也不会解析分号分隔的路径。
解决方案
通过Shell COM接口模拟资源管理器中选中多文件并打开的行为,代码如下:
首先实现批量打开函数:
uses Windows, ShellAPI, ShlObj, ActiveX, ComObj; procedure OpenMultipleImages(const FilePaths: TStringList); var Shell: IShellDispatch; Folder: Folder; FolderItems: FolderItems; Item: FolderItem; I: Integer; begin if FilePaths.Count = 0 then Exit; // 创建Shell对象 Shell := CreateComObject(CLSID_Shell) as IShellDispatch; // 获取首个文件所在的文件夹 Shell.NameSpace(ExtractFilePath(FilePaths[0])).QueryInterface(IID_IFolder, Folder); FolderItems := Folder.Items; // 将所有文件添加到选中列表 for I := 0 to FilePaths.Count - 1 do begin Item := Folder.ParseName(ExtractFileName(FilePaths[I])); FolderItems.Add(Item); end; // 调用打开命令,模拟资源管理器回车操作 FolderItems.InvokeVerb('open'); end;
然后替换原代码中ShellExecute的调用部分:
var path, filename: string; filenames: TStringList; begin path := IncludeTrailingPathDelimiter(TPath.GetTempPath); filenames := TStringList.Create; try ForEachSelectedRecordInGrid( DragDBGrid1, procedure begin filename := Trim(ExtractFileName(DateienQDateiname.AsString)); if (filename <> '') then begin filename := path + filename; DateienQDatei.SaveToFile(filename); filenames.Add(filename); end; end ); if (filenames.Count > 0) then OpenMultipleImages(filenames); // 替换原ShellExecute调用 finally filenames.Free; end; end;
这种方式完全模拟资源管理器的多文件打开逻辑,默认图片查看器会正常支持多图切换浏览。
内容的提问来源于stack exchange,提问作者complete_stranger
相关产品推荐
相关产品推荐

