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.
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ı! –
@David, çok teşekkür ederim! Sen çok iyisin! –