Il modo per farlo è chiamare l'API Windows ShellExecuteEx()
passando il verbo properties
. Ci sono vari wrapper Python di alto livello, ma non sono riuscito a far funzionare nessuno di loro con il verbo properties
. Invece vorrei usare il buon vecchio 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)
Il motivo ho messo nella chiamata a sleep
è che la finestra di proprietà è mostrato come una finestra nel processo di chiamata. Se l'eseguibile Python termina immediatamente dopo la chiamata a ShellExecuteEx
, allora non c'è niente lì per servire la finestra di dialogo e non viene mostrato.
fonte
2011-11-02 19:52:48
Fantastico, funziona benissimo - grazie mille! Una delle cose che ho provato era simile a questa. Non stavo chiamando il sonno nel mio file di test in modo che avrebbe smesso di funzionare. Inoltre non stavo usando wintypes e passavo semplicemente None per la maggior parte dei parametri di ShellExecuteEx. È ora di leggere su ctypes! –
@David, grazie mille! Sei geniale! –