例如,假设我的桌面上有一个文件夹。当我打开文件夹时,程序是否可能在发生时运行?有什么方法可以确定打开特定文件夹的操作吗?
答案 0 :(得分:1)
您可以使用Microsoft发布的handle.exe
,也可以从Microsoft官方网站https://docs.microsoft.com/zh-cn/sysinternals/downloads/handle
下载后,将handle.exe
放在test.py
的同一文件夹中,然后执行python test.py $your_folder
以得到结果,仅供参考。
test.py
import os
import sys
candidate_folder = sys.argv[1]
print('Please wait for some seconds before the process done...')
rc = os.system("handle.exe -accepteula %s | findstr pid" %(candidate_folder))
if 0 == rc:
print('The folder is opened by above process.')
else:
print('No process open this folder now.')
1)test1 :(不要打开文件夹C:\ abc)
C:\Handle>python test.py C:\abc
Please wait for some seconds before the process done...
No process open this folder now.
2)test2 :(打开文件夹C:\ abc)
C:\Handle>python test.py C:\abc
Please wait for some seconds before the process done...
explorer.exe pid: 15052 type: File 2B9C: C:\abc
explorer.exe pid: 15052 type: File 2BC0: C:\abc
The folder is opened by above process.
答案 1 :(得分:0)
您可以通过频繁轮询当前打开的Windows标题this recipe来实现此目的。
使函数尝试查找具有预期标题的窗口对象,如果找到一个则返回True,否则返回False。
现在您可以有一个while True:
循环来调用该函数,检查它是否返回True(打开该文件夹时应该发生,如果使用Windows资源管理器打开该文件夹并显示该文件夹的名称,则打开该文件夹(在标题栏中),然后等待几秒钟,然后重试。也许您可以对hwnd
对象进行其他检查,以确保它是一个资源管理器进程,而不是其他事情,我不知道。
我对windll函数了解不多,也许有一种方法可以避免轮询,并且在窗口状态发生变化时会通过某种事件得到通知,这将使代码更高效且更具弹性。
更正了几件事后的完整工作示例(在Windows 7上测试,“在标题栏中显示完整路径”文件夹选项已打开):
import ctypes
import time
EnumWindows = ctypes.windll.user32.EnumWindows
EnumWindowsProc = ctypes.WINFUNCTYPE(ctypes.c_bool, ctypes.POINTER(ctypes.c_int), ctypes.POINTER(ctypes.c_int))
GetWindowText = ctypes.windll.user32.GetWindowTextW
GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
IsWindowVisible = ctypes.windll.user32.IsWindowVisible
class FoundWindow(Exception):
pass
def titleExists(title):
status = []
def foreach_window(hwnd, lParam):
if IsWindowVisible(hwnd):
length = GetWindowTextLength(hwnd)
buff = ctypes.create_unicode_buffer(length + 1)
GetWindowText(hwnd, buff, length + 1)
if buff.value == title:
status.append(True)
return True
EnumWindows(EnumWindowsProc(foreach_window), 0)
return len(status) > 0
while True:
if titleExists(u"C:\Windows"):
print('The "C:\Windows" directory was opened!')
exit(0)
time.sleep(1)
我对python不好,所以我不得不采取丑陋的技巧来跟踪EnumWindowsProc调用中发生的事情,也许有更好的方法,但是它可以工作。