2010-02-07 5 views
6

... für den aktuellen Benutzer? für alle Benutzer?Wie bekomme ich den Pfad zum Programmverzeichnis des Startmenüs?

Ich arbeite ein kleines Programm, das Links im Startmenü erstellen muss. Momentan bin ich hardcoding wie unten, aber es funktioniert nur in englischen locales, zum Beispiel sollte es "Startmenü" in deutsch sein. Was sind sauberere, tragbare Ansätze?

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

danke

Antwort

1

Ein Freund, Luke Pinner von Environment.gov.au, gab eine Lösung per E-Mail, die ein Kernmodul (Python 2.5+) verwendet. Es wird davon ausgegangen, dass es mehrsprachig ist, da die Rückgabe des API-Aufrufs Unicode ist. Getestet auf Win7 mit japanischem Gebietsschema, und auf einer anderen us-Englisch Maschine durch manuelles Ändern Startmenü auf % auf Punkt USERPROFILE% \ Startmenü

''' 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: beste Referenz, die ich für MS 'SHGetFolderPath finden konnte, ist [hier] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx) , die feststellt, dass es ab Vista zugunsten von ['SHGetKnownFolderPath'] veraltet ist (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188 (v = vs.85) .aspx) –

10

ich 2 Möglichkeiten, dies zu tun, gehört habe. Erstens:

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

Zweitens mit der WScript.Shell Objekt (Quelle: 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") 

Eine andere Quelle: http://blogs.msdn.com/saveenr/archive/2005/12/28/creating-a-start-menu-shortcut-with-powershell-and-python.aspx

+0

Die „Eine andere Quelle“ link hatte alles, was ich gesucht habe! :) – panofish

+1

erstes Beispiel ist unvollständig, 'shellcon' ist nicht definiert. Die Importzeile sollte 'von win32com.shell sein, Shell, shellcon 'vielleicht importieren? –

2

Auch ist CSIDL_COMMON_STARTMENU für alle Benutzer beim Hoch- und CSIDL_STARTMENU für Strom Benutzerstart.

Verwandte Themen