WPF 打开资源管理器且选中某个文件

news/2025/1/15 13:03:30/文章来源:https://www.cnblogs.com/lindexi/p/18548977

打开资源管理器且选中某个文件可以使用 cmd 调用 explorer 带上 select 参数,如下面命令行所示

explorer.exe /select,"C:\Folder\file.txt"

但有很多情况下,用户可能使用其他资源管理器,此时将会导致应用软件打开的是 explorer 而不是用户默认的资源管理器

通过 shell32.dll 提供的 SHOpenFolderAndSelectItems 方法,可以直接使用函数调用的方式打开资源管理器且选中某个文件,且使用的是用户设置的默认的资源管理器

以下是我创建的简单的 WPF 例子程序的界面,可以看到界面非常简单,就是输入一个文件,然后点击按钮就可以打开资源管理器选中输入的文件

    <Grid><Grid VerticalAlignment="Center"><Grid.ColumnDefinitions><ColumnDefinition Width="Auto"></ColumnDefinition><ColumnDefinition Width="*"></ColumnDefinition><ColumnDefinition Width="Auto"></ColumnDefinition></Grid.ColumnDefinitions><TextBlock Text="文件路径:" Margin="50,0,0,0" VerticalAlignment="Center"/><TextBox x:Name="InputTextBox"  Grid.Column="1" Margin="10,0,10,0" VerticalAlignment="Center"/><Button Grid.Column="2" Content="打开" Margin="10,0,50,0" VerticalAlignment="Center" Click="Button_OnClick"/></Grid></Grid>

按钮的后台代码将需要使用 PInvoke 调用 Win32 函数。对于 dotnet 7 以前的程序,可使用如下方式定义

    [DllImport("shell32.dll", ExactSpelling = true)]private static extern void ILFree(IntPtr pidlList);[DllImport("shell32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]private static extern IntPtr ILCreateFromPathW(string pszPath);[DllImport("shell32.dll", ExactSpelling = true)]private static extern int SHOpenFolderAndSelectItems(IntPtr pidlList, uint cild, IntPtr children, uint dwFlags);

对于 dotnet 7 以及更高版本的项目,可使用 LibraryImportAttribute 特性辅助定义。如以下 C# 代码所示

    [LibraryImport("shell32.dll")]private static partial void ILFree(IntPtr pidlList);[LibraryImport("shell32.dll", StringMarshalling = StringMarshalling.Utf16)]private static partial IntPtr ILCreateFromPathW(string pszPath);[LibraryImport("shell32.dll")]private static partial int SHOpenFolderAndSelectItems(IntPtr pidlList, uint cild, IntPtr children, uint dwFlags);

过程中别忘了在 csproj 项目文件里面开启不安全代码,开启之后的项目文件代码大概如下

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>WinExe</OutputType><TargetFramework>net9.0-windows</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings><UseWPF>true</UseWPF><AllowUnsafeBlocks>True</AllowUnsafeBlocks></PropertyGroup></Project>

后台 C# 代码的按钮点击事件里面将调用 SHOpenFolderAndSelectItems 方法打开资源管理器选中输入的文件

    private void Button_OnClick(object sender, RoutedEventArgs e){var filePath = InputTextBox.Text;filePath = System.IO.Path.GetFullPath(filePath);IntPtr pidlList = ILCreateFromPathW(filePath);if (pidlList != IntPtr.Zero){try{Marshal.ThrowExceptionForHR(SHOpenFolderAndSelectItems(pidlList, 0, IntPtr.Zero, 0));}finally{ILFree(pidlList);}}}

以上代码里面的 ILCreateFromPathW 要求传入绝对路径,需要调用 System.IO.Path.GetFullPath 方法转换传入路径为绝对路径

如果不知道代码如何写的话,可以拉取我的例子项目代码跑跑看

本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快

先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 6988631e41226832c3b83cf62529eb7d7892e0b2

以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 6988631e41226832c3b83cf62529eb7d7892e0b2

获取代码之后,进入 WPFDemo/WilinojearcheWheyecearhire 文件夹,即可获取到源代码

更多 WPF 博客,请参阅 博客导航

参考文档

c# - How to open Explorer with a specific file selected? - Stack Overflow

file - C#: How to use SHOpenFolderAndSelectItems - Stack Overflow

c#: 打开文件夹并选中文件 - 楚人无衣 - 博客园

SHOpenFolderAndSelectItems 函数 (shlobj_core.h) - Win32 apps - Microsoft Learn

【C#】在Windows资源管理器打开文件夹,并选中指定的文件或文件夹 - Tod's - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/834444.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Virtual Box 虚拟机扩容

Virtual Box 虚拟机扩容 扩容有风险,有可能导致磁盘损坏,系统不可用。 需要使用的工具 gparted GParted -- A free application for graphically managing disk device partitions 步骤图解 1.扩大虚拟硬盘的容量2.加载分区工具执行分区操作3.扩展逻辑卷 要扩大 / 分区的空间…

RealCustom:缩小真实文本词的范围,实现实时开放域文本到图像的定制

RealCustom:缩小真实文本词的范围,实现实时开放域文本到图像的定制文本到图像定制旨在为给定的主题合成文本驱动的图像,最近彻底改变了内容创作。现有的作品遵循伪词范式,即将给定的主题表示为伪词,然后将其与给定的文本组合在一起。然而,伪词与给定文本固有的纠缠扩散范…

网站f12代码怎么修改,掌握网站F12调试工具的使用技巧

打开F12开发者工具:在浏览器中打开您需要调试的网页,按下F12键或右键点击页面任意位置选择“检查”(Inspect),即可打开开发者工具。选择Elements面板:在开发者工具顶部的选项卡中,选择“Elements”面板。这里显示了当前页面的HTML结构。查找目标元素:使用鼠标悬停在页面…

织梦手机网站模板修改,如何在织梦CMS中修改手机网站模板

织梦CMS(DedeCMS)支持手机网站模板的自定义,通过以下步骤可以轻松修改手机网站模板:登录后台:打开浏览器,输入织梦CMS的后台地址,使用管理员账号登录。进入模板管理:在后台左侧菜单栏中选择“模板” -> “默认模板管理”。 选择“手机模板”选项卡,查看当前使用的手…

网站开源代码修改,如何在本地开发环境中修改网站开源代码

修改网站开源代码可以定制网站的功能和设计。以下是修改网站开源代码的步骤:克隆代码仓库:使用Git或其他版本控制工具克隆网站的开源代码仓库。 例如:git clone https://github.com/username/repository.git cd repository安装依赖:根据项目文档安装所需的依赖库。 例如,使…

Codeforces Round 985 div2 个人题解(A~E)

Codeforces Round 985 div2 个人题解(A~E) Dashboard - Codeforces Round 987 (Div. 2) - Codeforces 火车头 #include <bits/stdc++.h>using namespace std;#define ft first #define sd second#define yes cout << "yes\n" #define no cout << &…

CTF/9/pwnerTool,一个适用于CTF中自动对Pwn题目文件进行信息收集,并且生成基础做题py文件的Pwn工具

CTF中自动对Pwn题目文件进行信息收集,并且生成基础做题py文件的Pwn工具,适用于Ubuntu 随手写的,写的不好请轻喷. 一个用于ctf对Pwn题目文件进行信息收集,打包了检查文件类型、检查类型保护、新建py文件、寻找传参工具的过程。 同时可以修补题目给出的动态库和libc文件保证本…

Spacedrive :一款开源超高颜值功能强大的跨平台文件管理器

我们的文件越来越来越多,大量的文件分布在网盘,硬盘里面。即使电脑硬盘里面,也是分布在不同的地方,管理起来越来非常麻烦。 要是能够有一个软件,可以将网盘,硬盘和网络驱动器统一起来管理,将会是多么的方便。 今天就给大家推荐一个高颜值的文件管理软件——spacedrive,…

【shell脚本】监控IP频繁登录服务器脚本

该脚本的作用是监控IP登录失败次数,如果某个IP的登录失败次数超过设定的最大次数,则阻止该IP的进一步登录尝试。通过iptables防火墙阻止连接,当一个IP尝试登录次数超过5次时,iptables会阻止来自该IP的所有连接。 #!/bin/bashfunction secrity(){ # 设置要监控的登录失败次数…

[OtterCTF 2018]-内存取证-WP

看了很多大佬的博客,才发现他们的文章都会写摘要~~ 我就没写过哈哈(比较懒)。我的博客比较水,内容少而质量低,分类挺乱的,后面慢慢改善吧!写这篇主要是为了学习 vol2 的使用(八神推荐的嘿嘿),有不好的地方可以指点一下![OtterCTF 2018] WP [OtterCTF 2018] What the…

vm最小化安装centos

前期准备 VMware Workstation CentOS-7-x86_64-DVD-2009.iso http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/ 创建虚拟机默认下一步,选择稍后安装接着默认下一步,完成后编辑虚拟机设置镜像安装centos 选择第一个Install CentOS 7接着一路默认 配置静态ip 查看子网地…

《Django 5 By Example》阅读笔记:p105-p164

《Django 5 By Example》学习第5天,p105-p164总结,总计60页。 一、技术总结 1.文章标签功能 Django自带django-taggit。 2.自定义template tags 3.roadmap功能 4.RSS功能 5.full-text搜索功能 这里使用的是Postgresql,使用pip install psycopg安装后,执行“python manage.py…