2010-02-07 26 views
6

... ¿para el usuario actual? ¿para todos los usuarios?¿Cómo obtener la ruta del directorio Programas de Inicio?

Estoy trabajando en un pequeño programa que necesita crear enlaces en el menú de inicio. Actualmente estoy hardcoding como a continuación, pero solo funciona en inglés, por ejemplo, debería ser "Startmenü" en alemán. ¿Cuáles son los enfoques más limpios y más portátiles?

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

agradecimiento

Respuesta

1

Un amigo, Luke Pinner de Environment.gov.au, dio una solución por correo electrónico que utiliza un módulo principal (Python 2.5+). Se cree que es multilingüe ya que el retorno de la llamada API es unicode. Probado en Win7 con el idioma japonés, y en otra máquina nos-Inglés cambiando manualmente el menú Inicio para que apunte a % USERPROFILE% \ menú inicial

''' 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: la mejor referencia que pude encontrar para MS 'SHGetFolderPath' es [aquí] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx) , que señala que se desaprobó a partir de Vista a favor de ['SHGetKnownFolderPath'] (http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188 (v = vs.85) .aspx) –

10

He oído hablar de 2 maneras de hacer esto. Primero:

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

En segundo lugar, el uso del objeto WScript.Shell (fuente: 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") 

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

+0

El "Otra fuente" enlace tenía todo lo que estaba buscando! :) – panofish

+1

primer ejemplo está incompleto, 'shellcon' no está definido. Se supone que la línea de importación es 'del shell de importación win32com.shell, shellcon' tal vez? –

2

Además, CSIDL_COMMON_STARTMENU es para toda la puesta en marcha de usuario y CSIDL_STARTMENU para la corriente inicio del usuario

Cuestiones relacionadas