大家在 windows 下使用编辑器或者其它一些软件的时候应该遇到过这种功能: "在目录中显示", "打开文件所在目录",... 比如:
但是我发现它们的行为有两种:
对于同一个文件,
对于第一种行为, 直接使用 windows 的命令即可, explorer /select, path
比如在控制台上执行explorer /select, C:\Windows
, 这将会打开 C 盘并选中Windows 文件夹, 当然执行多少次就会打开多少个窗口.
问题是第二种行为如何实现?
程序是由 python+pyqt 写的, 如果第二种行为控制台命令可行的话, 直接把命令传给 subprocess 就行了, 如果控制台命令行不通, 在 python 下可有其它办法?
1
xuboying 2016-08-09 13:11:30 +08:00 via Android 1
可以选择 API 调用
|
2
Kisesy 2016-08-10 18:19:19 +08:00
最好不要执行 explorer /select ,这个会创建多个 explorer 进程,即使关掉窗口,这些进程也不会关掉
|
3
justou OP @Kisesy 我试了下, 关闭窗口后 explorer 的应用进程消失, 然后转为后台进程, 但是一会儿过后这些后台进程会自动结束,
我的是 win10 1511. 所以我才寻找可以只打开一个窗口方法, 翻了很久 windows api, 至今没解决 |
4
Kisesy 2016-08-10 20:19:35 +08:00
遗留进程的问题,在 Win7 上是有的,关于 API 可能是 SHOpenFolderAndSelectItems
|
5
justou OP @Kisesy 我也只找到这个, 感觉效果跟 explorer /select 是一样的, 翻了很久文档跟查找相关头文件就是找怎么用 ctypes 构造它的参数, 这方面资料太少了, 只好先用 explorer /select 先将就了下了
|
6
justou OP 还想到的办法是执行 explorer /select 后获得它的进程号, 再打开同一个文件的窗口时如果有旧的进程存在就先将那个进程杀死(用 psutil)后再打开新窗口, 这样的话每个文件就需要绑定一个进程号, 不想去改那些代码了, 已经把 show_in_explorer(filename)独立出来了, 只需要给它个文件名就可以, 不想它跟其它代码发生关系
|
7
Kisesy 2016-08-10 21:18:45 +08:00 1
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 ,请把路径转一下码 |
8
Kisesy 2016-08-10 21:19:55 +08:00
不想转码就把 ILCreateFromPathW 换成 ILCreateFromPathA
|
10
Kisesy 2016-08-10 21:30:55 +08:00
|
11
justou OP 唉, 没想起在那儿搜, 前不久才注册了账号(´+ω+`)
|