如何制作一个;此链接需要在程序中打开;链接(windows注册表)

如何制作一个;此链接需要在程序中打开;链接(windows注册表),windows,nsis,Windows,Nsis,我已经试着让它工作好几个小时了。它几乎在工作。 我的情况是,我正在使用nsis创建一个安装程序,并希望创建一个类似skype(call&skype)和steam的链接(steam://join/214456146)这将启动带有一些参数的程序 问题是我无法让它将参数从链接发送到程序。 如果我用cmd运行程序,它会正常工作 以下是我的nsis代码中(尝试)在注册表中注册某些内容的部分: WriteRegStr HKCR "AudioOmega" "" "URL:AudioOmega Game Pro

我已经试着让它工作好几个小时了。它几乎在工作。 我的情况是,我正在使用nsis创建一个安装程序,并希望创建一个类似skype(call&skype)和steam的链接(steam://join/214456146)这将启动带有一些参数的程序

问题是我无法让它将参数从链接发送到程序。 如果我用cmd运行程序,它会正常工作

以下是我的nsis代码中(尝试)在注册表中注册某些内容的部分:

WriteRegStr HKCR "AudioOmega" "" "URL:AudioOmega Game Protocol"
WriteRegStr HKCR "AudioOmega" "URL Protocol" ""
WriteRegStr HKCR "AudioOmega\DefaultIcon" "" "$INSTDIR\game-controller.exe,1"
WriteRegStr HKCR "AudioOmega\shell" "" "open"
WriteRegStr HKCR "AudioOmega\shell\open\command" "" "$INSTDIR\game-controller.exe %1 %2 %3"

另一个问题是,当我单击带有自定义协议名称(a)的链接时udioomega://parms)它出现了一个对话框,但没有说AudioOmega游戏控制器,它说的是脚本的路径+%1、%2和%3

您没有指定您正在谈论的对话框!所有主流浏览器都有自己的对话框实现,当您单击协议链接时,会出现该对话框。直接调用Windows shell时,它不会显示任何对话框

当使用ShellExecute调用时,您可以指定额外的参数,但是对于由浏览器启动的内容,您需要将所有内容都放在URI中,因为大多数实现只使用%1

Internet Explorer使用
FriendlyAppName
值作为应用程序名称(如果存在):

Page Components
Page InstFiles

!include FileFunc.nsh
!include LogicLib.nsh

Function .onInit
${GetParameters} $0
${GetOptions} $0 "/uri=" $1
${IfNot} ${Errors}
    MessageBox MB_OK "Started as protocol.$\n$\nCommand line=$0"
    Quit
${EndIf}
FunctionEnd

Section "Register protocol" ; This example uses HKCU\Software\Classes and not HKCR so it works as non-admin
WriteRegStr HKCU "Software\Classes\TestProto" "" "URL:TestProto Protocol"
WriteRegStr HKCU "Software\Classes\TestProto" "FriendlyTypeName" "TestProto protocol"
WriteRegStr HKCU "Software\Classes\TestProto" "URL Protocol" ""
; Optional: UseOriginalUrlEncoding
WriteRegExpandStr HKCU "Software\Classes\TestProto\DefaultIcon" "" "%SystemRoot%\system32\shell32.dll,6"
WriteRegStr HKCU "Software\Classes\TestProto\shell" "" "open"
WriteRegStr HKCU "Software\Classes\TestProto\shell\open" "FriendlyAppName" "Test app for TestProto protocol"
WriteRegStr HKCU "Software\Classes\TestProto\shell\open\command" "" '"$exepath" /uri="%1" /params="%2 %3 %4"'
SectionEnd

Section "Test protocol"
ExecShell "" "testproto://foo/bar?a=b&c=d" '1 "t w o" 3'
InitPluginsDir
FileOpen $0 "$PluginsDir\test.html" w
FileWrite $0 '<html><body><a href="testproto://hello/world?a=b&c=d">Test</a></body></html>'
FileClose $0
ExecShell "" "$PluginsDir\test.html"
SectionEnd

Section "Unregister protocol"
MessageBox MB_OK "Click OK to remove the protocol handler..."
DeleteRegKey HKCU "Software\Classes\TestProto"
SectionEnd
页面组件
页面文件
!包括FileFunc.nsh
!包括LogicLib.nsh
函数。onInit
${GetParameters}$0
${GetOptions}$0”/uri=“$1
${IfNot}${Errors}
MessageBox MB_OK“作为协议启动。$\n$\n命令行=$0”
退出
${EndIf}
功能端
“登记协议”一节;此示例使用HKCU\Software\Classes而不是HKCR,因此它可以作为非管理员使用
WriteRegStr HKCU“软件\类\测试协议”“”“URL:TestProto协议”
WriteRegStr HKCU“软件\类\测试协议”“友好类型名称”“测试协议”
WriteRegStr HKCU“软件\类\测试协议”“URL协议”
; 可选:使用OriginalurEncoding
WriteRegeExpandStr HKCU“软件\Classes\TestProto\DefaultIcon”“”“%SystemRoot%\system32\shell32.dll,6”
WriteRegStr HKCU“软件\Classes\TestProto\shell”“打开”
WriteRegStr HKCU“软件\Classes\TestProto\shell\open”“FriendlyAppName”“TestProto协议测试应用”
WriteRegStr HKCU“Software\Classes\TestProto\shell\open\command”“”“$exepath”/uri=“%1”/params=“%2%3%4”
分段结束
“测试协议”一节
ExecShell“”testproto://foo/bar?a=b&c=d“'1”t w“3”
InitPluginsDir
FileOpen$0“$PluginsDir\test.html”w
文件写入$0“”
文件关闭$0
ExecShell“$PluginsDir\test.html”
分段结束
“注销协议”一节
MessageBox MB_OK“单击OK以删除协议处理程序…”
DeleteRegKey HKCU“软件\类\测试原型”
分段结束