2010-02-07 85 views
6

...为当前用户?为所有用户?如何获取开始菜单程序目录的路径?

我正在开发一个需要在开始菜单中创建链接的小程序。目前我像下面一样硬编码,但它只能在英文区域使用,例如它应该是德文的“Startmenü”。什么是更清洁,更便携的方法?

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

谢谢

回答

1

Environment.gov.au的朋友Luke Pinner通过使用核心模块(python 2.5+)的电子邮件给出了解决方案。相信是多语言的,因为来自API调用的返回是unicode。经测试Win7上使用日语语言环境,另一个美国英语机器上手动更改开始菜单指向%USERPROFILE%\开始菜单

''' 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

供参考:我可以找到MS'SHGetFolderPath'的最佳参考是[here](http://msdn.microsoft.com/en-us/library/windows/desktop/bb762181%28v=vs.85%29.aspx) ,它注意到它不赞成使用['SHGetKnownFolderPath'](http://msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v = vs.85).aspx) – 2011-10-24 16:36:14

10

我听说过这样的2种方式。第一:

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

其次,使用WScript.Shell对象(源: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") 

另一个来源:http://blogs.msdn.com/saveenr/archive/2005/12/28/creating-a-start-menu-shortcut-with-powershell-and-python.aspx

+0

的“另一个源”链接了一切,我一直在寻找! :) – panofish 2015-02-13 19:59:58

+1

第一个示例不完整,'shellcon'未定义。导入行应该是'从win32com.shell导入shell,shellcon'可能? – 2015-04-28 10:10:13

2

此外,CSIDL_COMMON_STARTMENU是所有用户启动和CSIDL_STARTMENU用于电流用户启动。

相关问题