如何在客户端启动桌面应用程序

21

在我的网页中,如果客户端安装了桌面应用程序,我需要启动它。有没有什么办法可以实现?

如果要启动的应用程序是 MS Office 或 Adobe Reader,我知道如何启动它们,但我想要启动的应用程序是自定义的,无法在互联网上找到。

我该怎么打开这个应用程序?


为什么你不直接让用户自己打开程序呢? - gen_Eric
7
为什么要设计网页布局,为什么不直接让用户查看源代码?这只是一个需求。 - hguser
如果应用程序是MS Office或Adobe Reader,我知道如何启动它们。你可以分享一下如何启动它们吗? - Meir
6个回答

20

基本上,除非应用程序注册将触发它的协议,否则不可能实现。如果应用程序这样做了,您需要做的就是使用该协议提供一个链接

yourcustomapp://some.parameters

另一种第三方应用程序与浏览器集成的方法是作为插件连接到浏览器。这就是Flash应用程序等的工作原理。

如果您尝试启动的应用程序不支持此类操作,则将几乎不可能实现您所需的功能。


7
你能提供一个解释如何定义和注册这样的协议的链接吗? - retrodrone
应用程序必须已经在客户端计算机上运行,或者至少某个代理程序必须在运行。它必须在某个端口上进行监听。 - Pointy
这是我目前采用的方法,但我还缺少一个要素:如何在页面加载时触发应用程序的“自动运行”?似乎协议处理程序被API限制为需要用户交互(实际上是用户点击),但我只希望应用程序在页面加载时启动。如果有安全警告等(与任何协议处理程序链接预期的一样)我也不介意...我只是想让它启动。有什么想法吗? - Greg Pettit
要注册这样的协议,您可以查看此答案。我在Chrome版本58.0.3029.81中进行了测试。唯一不起作用的是在地址栏中输入协议,在其他浏览器中似乎可以工作。 - ColmanJ
这太棒了!! 创建一个监听端口的小服务器,并远程触发它以进行 get 请求,并让该服务器程序执行一些操作。为什么我之前没有想到过这个! - dewwwald

10

浏览器沙箱禁止您执行本地资源,这是有充分理由的-为了防止网站通过恶意代码破坏您的计算机。我一直在研究同样的功能。

我找到的唯一解决方案是在Mozilla Firefox中构建一个扩展程序,可以启动您的应用程序。扩展程序位于沙箱之外,因此可以执行本地资源。请参见此页面了解如何操作。您也可以尝试使用crossrider跨浏览器进行操作,尽管我还没有成功过。

或者,您可以构建一个厚客户端,从网络服务填充数据,并通过上述扩展从浏览器启动。这就是我用来绕过沙箱的方法。我正在使用本地XUL来实现这一点。

更多讨论请参见我的问题


3/4个链接已经失效 :( - Burak

8
首先,无法使用任何可移植机制的JavaScript实现此操作。

如果应用程序是Microsoft Office或Adobe Reader,我知道如何启动它们。

不,你不知道 - 你只知道如何发送文档,然后浏览器会将其与这些应用程序关联并提供响应本地副本的名称来调用它们。你不能直接启动这些程序。
你只需要为你的应用程序做同样的事情 - 发明一个新的MIME类型(主类型将是“application”,按照惯例,非标准的次要类型以“x-”为前缀,因此你可以使用application/x-hguser),然后在浏览器端将该MIME类型与相关程序进行关联。
也就是说:你需要显式配置每个浏览器。

2
你能提供一个关于关联自定义 MIME 类型的详细链接吗?这对我正在尝试在封闭环境中解决的问题可能非常有用。 - retrodrone

5

我在一些复杂的生产环境中遇到了这个问题。

我使用以下代码来解决:

function launch(p_app_path)
{
   var oShell = new ActiveXObject("WScript.Shell");
   oShell.Run('"' + p_app_path + '"', 1);
}

在IE中,选择 选项 > 安全 > 自定义级别 > ActiveX 控件和插件 > 初始化和执行未标记为安全的 ActiveX 控件的脚本,将值设置为询问启用

当您的网站被封装到特定的安全上下文中时,这并不是一个安全问题。正如他们所说,建造煤气厂是不值得的。


3
这只在IE浏览器中有效还是其他浏览器也能用? - Wouter Lievens

1

仅使用JavaScript是无法实现这一点的(即使使用MS Office或Adobe Reader也不行)。幸运的是。

有许多旧方法,包括使用ActiveX,可能适合您的需求。正如其他人在输入时指出的那样,您可以根据MIME类型或协议等自定义响应。

无论如何,您都需要控制最终用户的浏览器。如果您处于一个可以规定策略(用户必须使用特定的浏览器,并具有特定的配置)的封闭环境中,则必须这样做。对于没有控制最终用户的开放环境,您将毫无办法。


1

我目前在使用SiteFusion时非常成功。它是一个PHP客户端/服务器应用程序框架,可以从在Apache中运行的服务器守护程序中提供XUL/JavaScript应用程序。您可以通过XULRunner中的非常轻量级的客户端或者潜在地通过扩展从网页上访问应用程序。客户端可以在任何平台上执行,并且它们位于浏览器沙盒之外,因此可以访问本地资源,例如可执行文件。这是一个相当优雅的解决方案,他们的网站提供了很好的示例和文档,他们的论坛也非常响应。我实际上发现了一个小错误,在论坛上发布了一个关于传递参数到本地可执行文件的问题,然后由首席开发人员在不到15分钟内修复了这个问题。总体来说,非常令人印象深刻!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接