2011-11-02 15 views

cevap

5

Bunu yapmanın yolu, properties fiilini geçerek Windows ShellExecuteEx() API'yi çağırmaktır. Bunun çeşitli yüksek seviyeli Python sarmalayıcıları var ama bunlardan hiçbirininfiiliyle çalışmasını sağlamadım. Bunun yerine iyi eski ctypes kullanırdım.

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) 

Ben sleep çağrısına koymak nedeni özellikleri iletişim çağıran sürecinde bir pencere olarak gösterilir olmasıdır. Python yürütülebilir aracı, aramayı ShellExecuteEx numaralı çağrıya derhal sonlandırırsa, iletişim kutusunu servis etmek için hiçbir şey yoktur ve gösterilmez.

+0

Harika, bu harika çalışıyor - çok teşekkürler! Denediğim şeylerden biri buna benzerdi. Test dosyasında uyku çağırmadım, bu yüzden çalışmayı durduracaktı. Ayrıca wintypes kullanmıyordum ve sadece ShellExecuteEx parametrelerinin çoğu için Hiçbiri geçmiyordu. Timsahları okuma zamanı! –

+0

@David, çok teşekkür ederim! Sen çok iyisin! –

İlgili konular