在 Windows 中显示文件的资源管理器属性对话框

问题描述 投票:0回答:2

有没有一种简单的方法可以使用 Python 在 Windows 中显示文件的属性对话框?

我正在尝试显示当您右键单击资源管理器中的文件并选择“属性”时弹出的相同窗口。

python windows winapi
2个回答
8
投票

执行此操作的方法是调用 Windows

ShellExecuteEx()
API 并传递
properties
动词。有各种高级 Python 包装器,但我还没有成功地让它们中的任何一个与
properties
动词一起使用。相反,我会使用旧的
ctypes

import time
import ctypes
import ctypes.wintypes

SEE_MASK_NOCLOSEPROCESS = 0x00000040
SEE_MASK_INVOKEIDLIST = 0x0000000C

class SHELLEXECUTEINFO(ctypes.Structure):
    _fields_ = (
        ("cbSize",ctypes.wintypes.DWORD),
        ("fMask",ctypes.c_ulong),
        ("hwnd",ctypes.wintypes.HANDLE),
        ("lpVerb",ctypes.c_char_p),
        ("lpFile",ctypes.c_char_p),
        ("lpParameters",ctypes.c_char_p),
        ("lpDirectory",ctypes.c_char_p),
        ("nShow",ctypes.c_int),
        ("hInstApp",ctypes.wintypes.HINSTANCE),
        ("lpIDList",ctypes.c_void_p),
        ("lpClass",ctypes.c_char_p),
        ("hKeyClass",ctypes.wintypes.HKEY),
        ("dwHotKey",ctypes.wintypes.DWORD),
        ("hIconOrMonitor",ctypes.wintypes.HANDLE),
        ("hProcess",ctypes.wintypes.HANDLE),
    )

ShellExecuteEx = ctypes.windll.shell32.ShellExecuteEx
ShellExecuteEx.restype = ctypes.wintypes.BOOL

sei = SHELLEXECUTEINFO()
sei.cbSize = ctypes.sizeof(sei)
sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_INVOKEIDLIST
sei.lpVerb = "properties"
sei.lpFile = "C:\\Desktop\\test.txt"
sei.nShow = 1
ShellExecuteEx(ctypes.byref(sei))
time.sleep(5)

我调用

sleep
的原因是属性对话框在调用过程中显示为一个窗口。如果 Python 可执行文件在调用
ShellExecuteEx
之后立即终止,则没有任何内容可以为该对话框提供服务,并且该对话框不会显示。


0
投票

使用 Python 3,您在 lpVerb 和 lpFile 上会遇到此错误:

TypeError: bytes or integer address expected instead of str instance

因此,您必须使用以下代码将字符串转换为代码中的字节:encode('utf-8'),例如:

sei.lpVerb = "properties".encode('utf-8')
sei.lpFile = "C:\\Desktop\\test.txt".encode('utf-8')

参考:Python 3.5,ctypes:TypeError:需要字节或整数地址而不是 str 实例

© www.soinside.com 2019 - 2024. All rights reserved.