Cách thực hiện điều này là gọi API Windows ShellExecuteEx()
qua động từ properties
. Có nhiều trình bao bọc Python cấp cao khác nhau về điều này nhưng tôi đã không thành công trong việc đưa bất kỳ trình nào trong số chúng hoạt động với động từ properties
. Thay vào đó tôi sẽ sử dụng cũ tốt 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)
Lý do tôi đặt lệnh gọi là sleep
là hộp thoại thuộc tính được hiển thị dưới dạng cửa sổ trong quá trình gọi. Nếu thực thi Python chấm dứt ngay lập tức sau cuộc gọi đến ShellExecuteEx
, thì không có gì ở đó để phục vụ hộp thoại và nó không hiển thị.
Nguồn
2011-11-02 19:52:48
Tuyệt vời, công trình này tuyệt vời - cảm ơn rất nhiều! Một trong những điều tôi đã thử là tương tự như thế này. Tôi đã không gọi giấc ngủ trong tập tin thử nghiệm của tôi để có thể dừng nó hoạt động. Tôi cũng đã không sử dụng wintypes và chỉ đi qua Không cho hầu hết các thông số của ShellExecuteEx. Đã đến lúc đọc lên trên ctypes! –
@ David, cảm ơn bạn rất nhiều! Yo're đáng sợ! –