2010-02-07 35 views
6

... cho người dùng hiện tại? Cho tất cả người dùng?Cách lấy đường dẫn của thư mục Programs của chương trình Start Menu?

Tôi đang làm một chương trình nhỏ cần tạo liên kết trong menu bắt đầu. Hiện tại tôi đang hardcoding như dưới đây, nhưng nó chỉ hoạt động trong các ngôn ngữ tiếng Anh, ví dụ nó nên được "Startmenü" bằng tiếng Đức. Các phương pháp tiếp cận di động sạch hơn, dễ dàng hơn là gì?

OUR_STARTMENU = os.environ['ALLUSERSPROFILE'] + '\Start Menu\Programs\Our Stuff' 

cảm ơn bạn

Trả lời

1

Một người bạn, Luke Pinner của Environment.gov.au, đã đưa ra giải pháp bằng email sử dụng mô-đun lõi (python 2.5+). Được tin là đa ngôn ngữ khi trả lại từ cuộc gọi API là unicode. Thử nghiệm trên Win7 với locale Nhật Bản, và trên một máy chúng tôi-tiếng anh bằng cách thay đổi bằng tay Start Menu để trỏ đến % USERPROFILE% \ startmenu

''' Get windows special folders without pythonwin 
    Example: 
      import specialfolders 
      start_programs = specialfolders.get(specialfolders.PROGRAMS) 

Code is public domain, do with it what you will. 

Luke Pinner - Environment.gov.au, 2010 February 10 
''' 

#Imports use _syntax to mask them from autocomplete IDE's 
import ctypes as _ctypes 
from ctypes.wintypes import HWND as _HWND, HANDLE as _HANDLE,DWORD as _DWORD,LPCWSTR as _LPCWSTR,MAX_PATH as _MAX_PATH, create_unicode_buffer as _cub 
_SHGetFolderPath = _ctypes.windll.shell32.SHGetFolderPathW 

#public special folder constants 
DESKTOP=        0 
PROGRAMS=       2 
MYDOCUMENTS=       5 
FAVORITES=       6 
STARTUP=        7 
RECENT=        8 
SENDTO=        9 
STARTMENU=       11 
MYMUSIC=       13 
MYVIDEOS=       14 
NETHOOD=       19 
FONTS=        20 
TEMPLATES=       21 
ALLUSERSSTARTMENU=     22 
ALLUSERSPROGRAMS=     23 
ALLUSERSSTARTUP=     24 
ALLUSERSDESKTOP=     25 
APPLICATIONDATA=     26 
PRINTHOOD=       27 
LOCALSETTINGSAPPLICATIONDATA=  28 
ALLUSERSFAVORITES=     31 
LOCALSETTINGSTEMPORARYINTERNETFILES=32 
COOKIES=       33 
LOCALSETTINGSHISTORY=    34 
ALLUSERSAPPLICATIONDATA=   35 

def get(intFolder): 
    _SHGetFolderPath.argtypes = [_HWND, _ctypes.c_int, _HANDLE, _DWORD, _LPCWSTR] 
    auPathBuffer = _cub(_MAX_PATH) 
    exit_code=_SHGetFolderPath(0, intFolder, 0, 0, auPathBuffer) 
    return auPathBuffer.value 
+0

FYI: tài liệu tham khảo tốt nhất tôi có thể tìm thấy cho MS 'SHGetFolderPath' là [ở đây] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx) , lưu ý rằng nó không được dùng như Vista để ủng hộ ['SHGetKnownFolderPath'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188 (v = vs.85) .aspx) –

10

Tôi đã nghe nói về 2 cách để làm điều này. Đầu tiên:

from win32com.shell import shell 
shell.SHGetSpecialFolderPath(0,shellcon.CSIDL_COMMON_STARTMENU) 

Thứ hai, sử dụng các đối tượng WScript.Shell (nguồn: http://www.mail-archive.com/[email protected]/msg00992.html):

import win32com.client 
objShell = win32com.client.Dispatch("WScript.Shell") 
allUserProgramsMenu = objShell.SpecialFolders("AllUsersPrograms") 
userMenu = objShell.SpecialFolders("StartMenu") 

Một nguồn: http://blogs.msdn.com/saveenr/archive/2005/12/28/creating-a-start-menu-shortcut-with-powershell-and-python.aspx

+0

Các "nguồn tin khác" liên kết có tất cả mọi thứ tôi đang tìm kiếm! :) – panofish

+1

ví dụ đầu tiên chưa hoàn thành, 'shellcon' không được xác định. Dòng nhập khẩu được cho là 'từ shell nhập win32com.shell, shellcon' có thể? –

2

Ngoài ra, CSIDL_COMMON_STARTMENU là dành cho tất cả người sử dụng và khởi động CSIDL_STARTMENU cho hiện tại khởi động người dùng.

Các vấn đề liên quan