请教一个用程序打开 windows 资源管理器的问题

2016-08-09 13:09:33 +08:00
 justou

大家在 windows 下使用编辑器或者其它一些软件的时候应该遇到过这种功能: "在目录中显示", "打开文件所在目录",... 比如:

但是我发现它们的行为有两种:
对于同一个文件,

  1. pycharm, codeblocks 执行多少次"打开文件夹"就有多少个窗口出现
  2. 而 VS, programmer's notepad, 迅雷, 对于同一个文件, 无论执行多少次"打开文件夹"就只会出现一个窗口, 如果有一个旧的窗口存在了, 就仅仅是把它弹到最前面来.

对于第一种行为, 直接使用 windows 的命令即可, explorer /select, path
比如在控制台上执行explorer /select, C:\Windows, 这将会打开 C 盘并选中Windows 文件夹, 当然执行多少次就会打开多少个窗口.

问题是第二种行为如何实现?

程序是由 python+pyqt 写的, 如果第二种行为控制台命令可行的话, 直接把命令传给 subprocess 就行了, 如果控制台命令行不通, 在 python 下可有其它办法?

2793 次点击
所在节点    Python
11 条回复
xuboying
2016-08-09 13:11:30 +08:00
可以选择 API 调用
Kisesy
2016-08-10 18:19:19 +08:00
最好不要执行 explorer /select ,这个会创建多个 explorer 进程,即使关掉窗口,这些进程也不会关掉
justou
2016-08-10 18:53:15 +08:00
@Kisesy 我试了下, 关闭窗口后 explorer 的应用进程消失, 然后转为后台进程, 但是一会儿过后这些后台进程会自动结束,
我的是 win10 1511. 所以我才寻找可以只打开一个窗口方法, 翻了很久 windows api, 至今没解决
Kisesy
2016-08-10 20:19:35 +08:00
遗留进程的问题,在 Win7 上是有的,关于 API 可能是 SHOpenFolderAndSelectItems
justou
2016-08-10 21:00:26 +08:00
@Kisesy 我也只找到这个, 感觉效果跟 explorer /select 是一样的, 翻了很久文档跟查找相关头文件就是找怎么用 ctypes 构造它的参数, 这方面资料太少了, 只好先用 explorer /select 先将就了下了
justou
2016-08-10 21:12:52 +08:00
还想到的办法是执行 explorer /select 后获得它的进程号, 再打开同一个文件的窗口时如果有旧的进程存在就先将那个进程杀死(用 psutil)后再打开新窗口, 这样的话每个文件就需要绑定一个进程号, 不想去改那些代码了, 已经把 show_in_explorer(filename)独立出来了, 只需要给它个文件名就可以, 不想它跟其它代码发生关系
Kisesy
2016-08-10 21:18:45 +08:00
import ctypes

ctypes.windll.ole32.CoInitialize(None)
upath = r"C:\Windows\notepad.exe"
pidl = ctypes.windll.shell32.ILCreateFromPathW(upath)
ctypes.windll.shell32.SHOpenFolderAndSelectItems(pidl, 0, None, 0)
ctypes.windll.shell32.ILFree(pidl)
ctypes.windll.ole32.CoUninitialize()

唉。。网上抄的, Py3 用的,如果是 Py2 ,请把路径转一下码
Kisesy
2016-08-10 21:19:55 +08:00
不想转码就把 ILCreateFromPathW 换成 ILCreateFromPathA
justou
2016-08-10 21:26:24 +08:00
@Kisesy 非常感谢! 的确可行! 刚好满足需求!
可否贴一下原始地址, 唉... 对 windll 里面东西太陌生了
Kisesy
2016-08-10 21:30:55 +08:00
https://github.com/exaile/exaile/blob/master/xl/common.py

唉.... 其实以前我的 API 资料很多,但是被格式化了。。。只能现找了。。。
justou
2016-08-10 21:41:08 +08:00
唉, 没想起在那儿搜, 前不久才注册了账号(´+ω+`)

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

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

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

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

© 2021 V2EX