2010-02-07 19 views
6

... geçerli kullanıcı için? bütün kullanıcılar için?Başlat Menüsü Programları dizininin yolu nasıl alınır?

Başlat menüsünde bağlantı oluşturması gereken küçük bir program çalışıyorum. Şu anda aşağıdaki gibi kod yazıyorum, ancak sadece ingilizce yerel olarak çalışır, örneğin Almanca "Startmenü" olmalıdır. Daha temiz, daha taşınabilir yaklaşımlar nelerdir?

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

Eğer

cevap

1

Bir arkadaş, Environment.gov.au'dan Luke Pinner, bir çekirdek modül (python 2.5+) kullanan bir e-posta ile bir çözüm verdi. API çağrısının dönüşü unicode olduğu için çok dilli olduğuna inanılıyor. Japon yerel ayarıyla Win7 üzerinde test ve başka bizi-ingilizce makinede elle Başlat Menüsü değiştirerek % işaret edecek userprofıle% \ Başlat Menüsü

''' 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: MS 'SHGetFolderPath' için bulabildiğim en iyi başvuru [burada] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx) Vista’dan [SHGetKnownFolderPath'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188 (v = vs.85) .aspx)’dan yararlanmadığını belirtiyor. –

10

Bunu yapmanın 2 yöntemden duydum teşekkür ederim. İlk:

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

İkinci olarak, WScript.Shell nesnesini kullanarak (kaynak: 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") 

diğer bir kaynağı: Ayrıca http://blogs.msdn.com/saveenr/archive/2005/12/28/creating-a-start-menu-shortcut-with-powershell-and-python.aspx

+0

"Başka kaynak" bağlantısını her şeyi aradığım vardı! :) – panofish

+1

ilk örnek eksik, 'shellcon' tanımlı değil. İthalat hattı, win32com.shell import shell, shellcon''dan olabilir mi? –

2

, CSIDL_COMMON_STARTMENU akımı için tüm kullanıcı devreye alma ve CSIDL_STARTMENU içindir kullanıcı başlangıç

İlgili konular