Решение с добавлением NewItem в InternetShortcut в большинстве случаев будет работать, поскольку ProgId файлов с расширением .url по умолчанию равен InternetShortcut, но бывают случаи когда ProgId может быть равен другому значению.
В моём случае ProgId был установлен как IE.AssocFile.URL, но он также может быть, например, ChromeHTML, FirefoxURL, OperaHTML и т. д.
Значение ProgId хранится в реестре по следующему пути:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.url\UserChoice]
"ProgId" = "Your Value"
Таким образом, код python сначала должен получить значение ProgId, а уже затем добавить NewItem в соответствующий раздел реестра.
key_path = r"Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.url\UserChoice"
with reg.OpenKey(reg.HKEY_CURRENT_USER, key_path) as k:
progid = reg.QueryValueEx(k, "ProgId")[0]
print("Current ProgID:", progid)
base_path = r"SOFTWARE\\Classes\\" + progid + r"\\shell\\NewItem"
with reg.CreateKey(reg.HKEY_CURRENT_USER, base_path) as main_key:
reg.SetValueEx(main_key, 'MUIVerb', 0, reg.REG_SZ, 'New Item')
with reg.CreateKey(main_key, 'command') as cmd_key:
reg.SetValue(cmd_key, '', reg.REG_SZ, r'"C:\...\app.exe" "%1"')