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

257 天前
 jikun

环境: tauri:v2 windows:0.57.0

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

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

尝试的方法:

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

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

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

https://ex.noerr.eu.org/t/1102854

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

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

© 2021 V2EX