【问题标题】:How to get path of Start Menu's Programs directory?如何获取开始菜单的程序目录的路径?
【发布时间】:2011-01-14 01:01:30
【问题描述】:

...对于当前用户?对于所有用户?

我正在开发一个需要在开始菜单中创建链接的小程序。目前我正在像下面这样进行硬编码,但它只适用于英语语言环境,例如它应该是德语的“Startmenü”。什么是更清洁、更便携的方法?

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

谢谢

【问题讨论】:

    标签: python windows


    【解决方案1】:

    Environment.gov.au 的朋友 Luke Pinner 通过电子邮件提供了一个使用核心模块(python 2.5+)的解决方案。被认为是多语言的,因为 API 调用的返回是 unicode。在日文语言环境的 Win7 和另一台美式英语机器上通过手动更改开始菜单以指向 %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
    

    【讨论】:

    【解决方案2】:

    另外,CSIDL_COMMON_STARTMENU 用于所有用户启动,CSIDL_STARTMENU 用于当前用户启动。

    【讨论】:

      【解决方案3】:

      我听说过两种方法。第一:

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

      其次,使用 WScript.Shell 对象(来源:http://www.mail-archive.com/python-win32@python.org/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

      【讨论】:

      • “另一个来源”链接包含我正在寻找的一切! :)
      • 第一个示例不完整,shellcon 未定义。导入行应该是from win32com.shell import shell, shellcon 也许?
      猜你喜欢
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 2021-12-05
      相关资源
      最近更新 更多