2011-11-02 6 views

risposta

5

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.

+0

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! –

+0

@David, grazie mille! Sei geniale! –

Problemi correlati