2010-02-07 12 views
6

... dla bieżącego użytkownika? dla wszystkich użytkowników?Jak uzyskać ścieżkę do katalogu programów menu Start?

Pracuję mały program, który musi utworzyć łącza w menu Start. Obecnie jestem hardcoding jak poniżej, ale działa tylko w angielskich ustawień regionalnych, na przykład powinno być "Startmenü" w języku niemieckim. Jakie są czystsze, bardziej przenośne podejścia?

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

dziękuję

Odpowiedz

1

Znajomy, Luke Pinner z Environment.gov.au, podał rozwiązanie przez e-mail, który korzysta z modułu podstawowego (python 2.5+). Uważa się, że jest wielojęzyczny, ponieważ zwrot z wywołania API to kod Unicode. Testowane na Win7 z japońskim regionie, a na innej nas angielska maszyna ręcznie zmienić menu Start, aby wskazywał % USERPROFILE% \ Menu Start

''' 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: Najlepszym źródłem informacji dla MS 'SHGetFolderPath' jest [tutaj] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx) , który odnotowuje, że przestarzałe od Visty na korzyść ['SHGetKnownFolderPath'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188 (v = vs.85) .aspx) –

10

Słyszałem o 2 sposoby robienia tego. Po pierwsze:

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

Po drugie, przy użyciu obiektu Wscript.Shell (źródło: 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") 

Innym źródłem: http://blogs.msdn.com/saveenr/archive/2005/12/28/creating-a-start-menu-shortcut-with-powershell-and-python.aspx

+0

W „Innym źródłem” link miał wszystko szukałem! :) – panofish

+1

pierwszy przykład jest niekompletny, 'shellcon' nie jest zdefiniowany. Linią importu powinna być 'from win32com.shell import shell, shellcon' maybe? –

2

Również CSIDL_COMMON_STARTMENU jest dla wszystkich starcie użytkownika i CSIDL_STARTMENU dla prądu uruchomienie użytkownika.

Powiązane problemy