在 rust 中如何获取文件选择弹窗中鼠标选中的文件路径

2 天前
 GuoJikun

环境: tauri:v2 windows:0.57.0

获取上图中选中的文件路径“1.png”;

这个弹窗是其它程序开启的,但是我可以拿到窗口的 HWND ;

尝试的方法:

758 次点击
所在节点    程序员
12 条回复
PTLin
2 天前
你是要在打开这个文件选择窗口,鼠标点上这个文件的时候,获取到这个的路径吗?这么硬核的需求吗?
tinytoadd
2 天前
自己实现一个 file picker 可能可以
geelaw
2 天前
答案是不要尝试做这件事情。

IShellWindows 枚举的是 shell (Explorer) 里面打开的窗口,其他程序打开的文件选择对话框和 shell 没什么必然关系。

使用 GetWindowTextW 得到的是 hwnd 里面的文字,首先在那个文件对话框里面,对话框本身和对话框里面的文件名组合框(可以输入文本、可以下拉选择,也可以通过选定项目改变的,左边写着“文件名(&N):”的框),是两个窗口(甚至有可能那个组合框是无窗口控件),它们的 hwnd 都不一样,在对话框的 hwnd 上调用 GetWindowTextW 得到的是对话框的标题,和文件名没有关系。

那个组合框里的文本可以是用户乱写的,不一定对应任何一个文件。

即使用户通过选择一个文件导致组合框显示了文件名,它显示的名字也不一定是你期待的那一个——你可以在 notepad.exe 里面打开“打开”对话框,然后导航到 C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Accessibility ,选定放大镜的快捷方式,你会发现:

1. 显示的名字没有 .lnk
2. 显示的名字不是 Magnify.lnk 而是(中文)“放大镜”或者(英文)“Magnifier”

但是那个文件的名字是 Magnifier.lnk ,显示的名字是通过 desktop.ini 控制的。

————

最好直接问你想要做什么最终用户受益的事情,而不是怎么做你想到的一种可能的做法,避免 X-Y 问题。
geelaw
2 天前
@geelaw #3 那个文件的名字是 Magnify.lnk 。另外要让 notepad.exe 显示所有文件,只要在文件名里面输入 * 再按一下回车。
vvhy
2 天前
换个思路,拦截 GetOpenFileName 调用
GuoJikun
2 天前
@PTLin
不是,是鼠标选中后,按空格键预览,类似于[QuickLook]( https://github.com/QL-Win/QuickLook)
为了实现类似的功能,在选择文件前预览文件内容
GuoJikun
2 天前
@geelaw
> GetWindowTextW 看来这种方式时不可取的;
我想要完成的功能是,选择文件后按空格对文件进行预览,类似于 macos 的按空格预览功能
seansong
2 天前
自己实现一个文件选择功能比较靠谱,根据自己的需要自定义功能,这样还可以做出跟 app 更适配的 ui 风格
GuoJikun
2 天前
@tinytoadd
```rust
let file_dialog: IFileOpenDialog = CoCreateInstance(
&FileOpenDialog,
None,
CLSCTX_INPROC_SERVER
)?;
```
这种吗?
geelaw
2 天前
@GuoJikun #7 Alt+P 是官方的预览方式(但很可惜在 pickerhost 里不行)
cppc
2 天前
我觉得思路应该是跟文件管理器(Explorer.exe)进行交互,比如做成它的插件,捕获它的事件,甚至是 API HOOK 之类来得到你关注的信息。
GuoJikun
2 天前
已解决! 通过 ui 自动化获取选中文件名,然后通过获取地址栏的 text ( GetWindowTextW )获取目录结构,最后合并两者即可得到完整的地址

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1102854

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX