我知道现在在这里发布答案有点晚了,但我几个月前尝试过Olav的解决方案,但它没有完全起作用:工作目录是脚本的工作目录,所以我不得不删除if条件才能使其工作,但它选择了所有Windows资源管理器窗口中的所有文件(我也希望这样做,所以这部分对我有效)。但现在我回来继续我的项目(一个助理),我发现我真的需要这个工作,所以我考虑这个想法(这不是很难想到,但我花了几个月的时间…)。我不知道这个答案是否对其他人有用,但对我来说,它并不完全有效,所以我想我可以改进它,并在这里发布我的解决方案。这段代码是这个答案的混合体(我在同一个脚本中也使用过,但从未想过让它们一起工作):https://stackoverflow.com/a/43892579/8228163(至少在Windows7下可以工作)和Olav的答案以及对我有用的结果——脚本只在当前的Windows资源管理器窗口中检测文件。我想从Vista(也许,我不知道它的年龄超过7岁)到10岁,但我不完全确定。另一个答案是使用XP。当我在Windows10上启动这个脚本时,我认为它是有效的,但是我已经没有10个了,所以我不能确定(我又用了7,所以对于7来说这是有效的)。在import win32gui, time

from win32con import PAGE_READWRITE, MEM_COMMIT, MEM_RESERVE, MEM_RELEASE, PROCESS_ALL_ACCESS, WM_GETTEXTLENGTH, WM_GETTEXT

from commctrl import LVS_OWNERDATA, LVM_GETITEMCOUNT, LVM_GETNEXTITEM, LVNI_SELECTED

import os

import struct

import ctypes

import win32api

import datetime

import win32com.client as win32

import win32ui

import psutil

import subprocess

import time

import urllib.parse

clsid = '{9BA05972-F6A8-11CF-A442-00A0C90A8F39}' #Valid for IE as well!

def getEditText(hwnd):

# api returns 16 bit characters so buffer needs 1 more char for null and twice the num of chars

buf_size = (win32gui.SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0) +1 ) * 2

target_buff = ctypes.create_string_buffer(buf_size)

win32gui.SendMessage(hwnd, WM_GETTEXT, buf_size, ctypes.addressof(target_buff))

return target_buff.raw.decode('utf16')[:-1]# remove the null char on the end

def _normaliseText(controlText):

'''Remove '&' characters, and lower case.

Useful for matching control text.'''

return controlText.lower().replace('&', '')

def _windowEnumerationHandler(hwnd, resultList):

'''Pass to win32gui.EnumWindows() to generate list of window handle,

window text, window class tuples.'''

resultList.append((hwnd, win32gui.GetWindowText(hwnd), win32gui.GetClassName(hwnd)))

def searchChildWindows(currentHwnd,

wantedText=None,

wantedClass=None,

selectionFunction=None):

results = []

childWindows = []

try:

win32gui.EnumChildWindows(currentHwnd,

_windowEnumerationHandler,

childWindows)

except win32gui.error:

# This seems to mean that the control *cannot* have child windows,

# i.e. not a container.

return

for childHwnd, windowText, windowClass in childWindows:

descendentMatchingHwnds = searchChildWindows(childHwnd)

if descendentMatchingHwnds:

results += descendentMatchingHwnds

if wantedText and \

not _normaliseText(wantedText) in _normaliseText(windowText):

continue

if wantedClass and \

not windowClass == wantedClass:

continue

if selectionFunction and \

not selectionFunction(childHwnd):

continue

results.append(childHwnd)

return results

def explorer_fileselection():

global clsid

address_1=""

files = []

shellwindows = win32.Dispatch(clsid)

w=win32gui

window = w.GetForegroundWindow()

#print("window: %s" % window)

if (window != 0):

if (w.GetClassName(window) == 'CabinetWClass'): # the main explorer window

#print("class: %s" % w.GetClassName(window))

#print("text: %s " %w.GetWindowText(window))

children = list(set(searchChildWindows(window)))

addr_edit = None

file_view = None

for child in children:

if (w.GetClassName(child) == 'WorkerW'): # the address bar

addr_children = list(set(searchChildWindows(child)))

for addr_child in addr_children:

if (w.GetClassName(addr_child) == 'ReBarWindow32'):

addr_edit = addr_child

addr_children = list(set(searchChildWindows(child)))

for addr_child in addr_children:

if (w.GetClassName(addr_child) == 'Address Band Root'):

addr_edit = addr_child

addr_children = list(set(searchChildWindows(child)))

for addr_child in addr_children:

if (w.GetClassName(addr_child) == 'msctls_progress32'):

addr_edit = addr_child

addr_children = list(set(searchChildWindows(child)))

for addr_child in addr_children:

if (w.GetClassName(addr_child) == 'Breadcrumb Parent'):

addr_edit = addr_child

addr_children = list(set(searchChildWindows(child)))

for addr_child in addr_children:

if (w.GetClassName(addr_child) == 'ToolbarWindow32'):

text=getEditText(addr_child)

if "\\" in text:

address_1=getEditText(addr_child)[text.index(" ")+1:]

print("Address --> "+address_1)

for window in range(shellwindows.Count):

window_URL = urllib.parse.unquote(shellwindows[window].LocationURL,encoding='ISO 8859-1')

window_dir = window_URL.split("///")[1].replace("/", "\\")

print("Directory --> "+window_dir)

if window_dir==address_1:

selected_files = shellwindows[window].Document.SelectedItems()

for file in range(selected_files.Count):

files.append(selected_files.Item(file).Path)

print("Files --> "+str(files))

while True:

explorer_fileselection()

time.sleep(1)

这将查找活动的Windows资源管理器窗口,获取该窗口的地址,然后将该地址用于Olav的答案,以检查该地址是否等于在Windows资源管理器中打开的地址之一,从而从活动窗口获取文件。顺便说一句,因为这个脚本是两个答案的修改副本,所以它有来自这些答案的限制。所以,就像Olav的回答“编辑:还不起作用,至少在使用上下文菜单时是这样的”,那么这可能也不起作用,因为它是相同的代码-只是工作目录不同(虽然,我不知道他说的是什么意思,但就我测试的结果来看,它起作用了)。就像jameskent的答案一样,这不适用于桌面,只适用于使用windows资源管理器打开的窗口。

编码=“ISO 8859-1”是因为我是葡萄牙语,但可以更改,只需确保两个目录都相等而不必使用%?否则就没用了!在

因为这个问题只有近5年的时间,OP可能不再需要它了,但我需要它,却没有它在任何地方,所以我想我可以把这个贴在这里,也许可以帮助其他想这样做的人。脚本中的代码可用于了解当前Windows资源管理器窗口上的文件,并在XP以上的Windows上获取当前的Windows资源管理器窗口路径(对Vista不确定)。对于XP,请参阅原始答案(https://stackoverflow.com/a/43892579/8228163),要从所有Windows资源管理器窗口获取文件,只需从Olav的答案中删除if条件。在

感谢Olav和James Kent给出的答案,因为我会花更多的时间来尝试如何做到这一点(我是一个Python/任何语言begginner—只需编写一年代码,所以需要花费大量时间,也许我必须将其与另一个语言混合使用)。再次感谢你们,感谢你们的行动,感谢你们在正确的时间问了问题,让合适的人来回答!(因为Olav在链接上引用的源不再存在)。在

希望这有帮助!干杯!在

python资源管理器选择文件_Python:在资源管理器中获取选定文件的列表(windows7)...相关推荐

  1. python 查找指定文件_python实现在目录中查找指定文件的方法

    本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 代码如下: import os from glob import glob #用到了 ...

  2. python找到文件夹下指定文件_python实现在目录中查找指定文件的方法

    1. 模糊查找 编码以下:import os from glob import glob #采用了这一控制模块 def search_file(pattern, search_path=os.envi ...

  3. #窗体整人小程序_Excel VBA和文件夹-1.8通过对话框灵活选定文件的小技巧

    Excel VBA和文件夹-1.8通过对话框灵活选定文件的小技巧 前景提要 在之前,我们学习了如何通过对话框的形式来打开文件的方法,这种方法的好处就是两个字:灵活,我们不用在代码中强制指定必须在某个文 ...

  4. diff git 指定时间_【GIT】从指定分支两个Tag中获取差异文件,进行代码的增量更新...

    介绍 随着DevOps兴起,在做CD代码上线交付时候,代码全量更新是很费时间的.下面代码就可以帮助我们从指定分支两个Tag中获取差异文件,进行代码的增量更新. 环境 Jenkins Git代码管理 获 ...

  5. bak文件转oracle文件,如何在Oracle 11g中恢复.bak文件(How to restore .bak file in oracle 11g)...

    如何在Oracle 11g中恢复.bak文件(How to restore .bak file in oracle 11g) 我有Oracle 11g备份文件(.bak文件)如何在Oracle 11g ...

  6. IOS中获取各个文件的目录路径的方法和NSFileManager类

    转自:http://blog.sina.com.cn/s/blog_5fb39f910101di92.html IOS中获取各种文件的目录路径的方法 iphone沙箱模型的有四个文件夹,分别是什么,永 ...

  7. java资源文件路径_Java 中获取资源(文件)的路径问题总结

    Java 中获取资源(文件)的路径问题总结 首先,Java 中获取资源大体上可分为两种方式,基于 文件系统的 和 基于classpath的. 1. 基于文件系统的相对简单. 比如 构造一个File f ...

  8. python tk窗口 选择 销毁_Python tkinter - 删除其他窗口 - 已调用tk.withdraw()

    我正在编写一个小程序,在某些情况下,它会打开两个不同的文件浏览器. 起初,用户可以选择一个文件夹.如果该文件适合他,他可以关闭文件资源管理器窗口,另一个可以打开用户选择特定文件的窗口. 就像第二个文件 ...

  9. python解压加密zip文件_Python:解压缩前检测一个zip文件否为加密,两种算法。

    前一篇文章介绍了如何用python自动解压缩加密的zip文件, 但是有一个问题,在服务器端脚本在解加密zip文件之前,需要检测其是否是加密文件,若是,则询问密码,结合密码解压缩:如果不是,则则直接解压 ...

最新文章

  1. 深度学习常用数据集介绍
  2. BUUCTF-Reverse:reverse3
  3. BCB6.0下安装Indy9
  4. Blazor+Dapr+K8s微服务之服务调用
  5. nc 结合htc hts 反弹shell(内网代理环境下)
  6. Git分布式版本管理
  7. 什么叫内部银团_什么样的户型是好户型
  8. [TJOI 2015] 线性代数
  9. asterisk sip codec协商
  10. [每日一氵]上古年代的 Visual Studio2015 安装
  11. html 未读消息红点,消息未读之点不完的小红点(Node+Websocket)
  12. OPC基本知识介绍——什么是OPC
  13. WCH系列芯片CoreMark跑分
  14. 微信小程序样式-元素选择器的使用
  15. 【OpenCV】2020年关于SIFT算法专利版权问题的解决办法
  16. 就 3 点,提升工作效率
  17. 2022大数据产业年度“国产化优秀代表厂商”榜单发布,亚信科技AntDB数据库位列其中
  18. 分享65个NET源码,总有一款适合您
  19. 裸辞4个月,面试了34家公司,终于找到理想工作了
  20. 网络加速器(Web accelerator)是上网加速软件

热门文章

  1. oracle19c 安装权限_Oracle19c 安装及SQL developer连接
  2. usb转232线驱动_为什么越来越多人用USB,却不用RS232?USB有什么好?
  3. C++输入一个整数后接着输入字符串
  4. C++获取指向二维数组的首元素指针
  5. 【一鸣离职,左晖去世】互联网老兵给大家的三个建议
  6. 使用 mitmproxy + python 做拦截代理
  7. C++学习之路 | PTA乙级—— 1084 外观数列 (20 分)(精简)
  8. 滤波器开发之一:基于算数平均的平滑滤波器
  9. python3 Crypto环境
  10. 现代软件工程系列 学生读后感 梦断代码 DTSlob (2)