【问题标题】:Show Explorer's properties dialog for a file in Windows在 Windows 中显示文件资源管理器的属性对话框
【发布时间】:2011-11-02 18:02:20
【问题描述】:

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

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

【问题讨论】:

    标签: python windows winapi


    【解决方案1】:

    执行此操作的方法是通过 properties 动词调用 Windows ShellExecuteEx() API。有各种高级 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 后立即终止,则没有任何内容可以为该对话框提供服务并且它不会显示。

    【讨论】:

    • 太棒了,效果很好 - 非常感谢!我尝试过的一件事与此类似。我没有在我的测试文件中调用睡眠,这样它就会停止工作。我也没有使用wintypes,只是为ShellExecuteEx的大多数参数传递了None。是时候阅读 ctypes 了!
    • 这很好,但仅适用于单个文件。有人有多个文件的解决方案吗?
    • 是的,这也是可能的。在网络搜索将我带到这里的一个主题后,我实现了这一点。
    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多