Python创建Windows桌面快捷方式:在桌面路径变动的情况下也适用

踩坑示范与本文起因(错误尝试)

在用python做程序开发时, 我本以为创建Windows桌面快捷方式是一件很容易的事情;

首先为了创建快捷方式, 我首先想到的是调用Windows Scripting Host(WSH)中的Shell对象;

于是事情就分四步: 获取桌面快捷路径, 定义目标, 定义工作目录, 最后创建一个.lnk格式文件;

于是就有了第一次踩坑尝试: 

错误代码示例

import os
import sys
from win32com import client
#安装第三方库:pip install pywin32

def create_shortcut(target_path, shortcut_path):
    shell = win32com.client.Dispatch("WScript.Shell")
    shortcut = shell.CreateShortCut(shortcut_path)
    shortcut.Targetpath = target_path  #目标程序路径
    shortcut.WorkingDirectory = os.path.dirname(target_path) #工作路径
    shortcut.IconLocation = target_path #图标路径
    shortcut.save()

if __name__ == "__main__":
    target_path = sys.executable

    #获取桌面路径并和快捷方式拼接(但是这样会出现一个问题,下文再说)
    shortcut_path = os.path.join(os.path.expanduser("~"), "Desktop", "快捷方式.lnk")
    
    create_shortcut(target_path, shortcut_path)

错误原因

我写完后测试了一下,结果是一大片报红;

然后经排查,是快捷方式路径中的桌面路径不对;

os.path.join(os.path.expanduser("~"), "Desktop", "快捷方式.lnk")---这里用的是Windows系统默认的桌面路径;

但是我忘了一件事,我在很久之前就修改了我的桌面路径,所以我的桌面压根就不叫Desktop;

然后我就发现,这样写快捷方式路径也是不合理的,不能说每一个程序用户的桌面路径都用默认的Desktop吧(反正我的就不是╮(╯-╰)╭);

 本文起因

于是呢,就需要确保程序能不依赖这种用字符串定义的方式获取桌面路径;

所以我想,Windows系统中一定有什么方式记录着桌面的路径,或者决定了桌面路径,所以应当直接用Windows的API就可以获取到桌面路径 ;

然后我就开始翻阅资料,当时在网上翻了一下午,终于 --- 没翻到😂;

然后我去看Windows的官方文档,琢磨了差不多一个礼拜,才解决了这个问题(虽然那一个礼拜里我也要上课,但根本没想到这么耗时啊喂!(*  ̄︿ ̄)#);

于是就有了这篇文章的诞生;

 正确处理方式

正确代码示例(可用的完整代码)

import ctypes
from ctypes import wintypes
from win32com.client import Dispatch
#是的没错,还是pywin32
#还用了ctypes标准库,用于调用Windows的API

#获取桌面路径
def get_desktop_path():
    CSIDL_DESKTOP = 0x0000
    SHGFP_TYPE_CURRENT = 0
    buffer = ctypes.create_unicode_buffer(wintypes.MAX_PATH)
    #创建Unicode缓冲区
    ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_DESKTOP, None, SHGFP_TYPE_CURRENT, buffer)
    #调用Windows的API来获取桌面路径
    desktop_path = buffer.value
    #将将缓冲区的值,赋给变量desktp_path
    return desktop_path

#创建桌面快捷方式
def create_shortcut(path, target, work_Dir, icon=''):
    shell = Dispatch('WScript.Shell')
    shortcut = shell.CreateShortCut(path)
    shortcut.TargetPath = target
    shortcut.WorkingDirectory = work_Dir
    #shortcut.IconLocation = icon  --这是用来定义图标路径的,没有图标就不要了(icon参数:图标路径)
    shortcut.Save()

shortcut_path = get_desktop_path()+r'\快捷方式.lnk'
target_path = os.getcwd()+r"\程序名称.exe"  #.exe是因为最后这个py脚本要打包成exe
work_dir = os.getcwd()  #工作目录,就是快捷方式属性中的起始位置

creat_shortcut(shortcut_path, target_path, work_Dir)

代码解释 

创建快捷方式的函数就不说了,基础操作;

主要解释一下桌面路径的获取:

CSIDL_DESKTOP = 0x0000  --声明要获取的文件夹类型;


SHGFP_TYPE_CURRENT = 0  --声明要获取的是当前用户桌面路径;


buffer = ctypes.create_unicode_buffer(wintypes.MAX_PATH)  --创建一个Unicode缓冲区,用来存储桌面路径;


ctypes.windll.shell32.SHGetFolderPathW(None, CSIDL_DESKTOP, None, SHGFP_TYPE_CURRENT, buffer)   --这个就有点复杂了;

SHGetFolderPathW函数需要传递5个参数:

1.第一个参数:窗口句柄,用来制定调用该函数的窗口,这里直接用None表示不需要父窗口;

2.第二个参数:要获取的文件夹类型标识符,这里 CSIDL_DESKTOP=0x0000 表示桌面;

3.第三个参数:UI界面,None表示不需要显示UI(老实说,这个参数我也没搞懂);

4.第四个参数:标志位,用于控制函数的行为,这里 SHGFP_TYPE_CURRENT = 0 表示获取当前用户的文件夹路径;

5.第五个参数:指向接收文件路径的缓冲区,这里就是刚刚创建的缓冲区buffer;

然后桌面路径就存在这个buffer里面了;


desktop_path = buffer.value  --将buffer里面的值,赋给变量desktop_path;

本文到此结束,如果有不对或者有疑问的地方,欢迎在评论区发言(〃 ̄︶ ̄)人( ̄︶ ̄〃); 

 ps:小白过坑,不喜勿喷.

  • 31
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值