在子表单上的 SUMATRA PDF 中向 pdf 文档发送 DDE 命令

问题描述 投票:0回答:1

我有一个 MS-Access 2010 应用程序。我使用 Sumatra PDF 作为 pdf 查看器。为了使查看器适合应用程序,我使用以下简单的代码将查看器加载到子表单上:

Private Sub Form_Load() 'subform load procedure

    Dim inpFile As String, cmd As String
    
    inpFile = "D:\temp\test.pdf"

    cmd = CurrentProject.Path & "\SumatraPDF-3.5.2-32.exe -plugin " & _
          Me.Hwnd & " """ & inpFile & """"
    runShell cmd

End Sub

Private Function runShell(ByVal cmd As String)

    Dim wsh As Object
    
    Set wsh = VBA.CreateObject("WScript.Shell")
    wsh.Run cmd, vbHide, False 

    Set wsh = Nothing

End Function

这个效果很好。但是,我想从我的 VBA 应用程序使用 DDE 命令与 PDF 文档进行交互(Sumatra PDF 从 3.5 版开始支持 DDE)。

如果我将 Sumatra 作为应用程序运行,我可以使用此示例代码发送复制选择命令:

Private Sub Command1_Click()
    Dim channelNumber As Long
    
    channelNumber = Application.DDEInitiate("SUMATRA", "control")

    Application.DDEExecute channelNumber, "[CmdCopySelection]"
    Application.DDETerminate channelNumber

End Sub

由于Sumatra是在子窗体上加载的,没有可用的Sumatra应用程序,所以DDE启动失败。然而,苏门答腊岛正在作为一个进程运行......

还有一个复杂的因素:我的用户可以在子表单上打开多个 PDF 查看器实例,并且应用程序有多个用户,可以同时打开 PDF 查看器。

我的问题是:有没有办法确定在我的子窗体中运行的 Sumatra 进程的正确 DDE 通道?我可以使用子表单的 Hwnd 进行 API 调用吗?如果可以的话,能给我一些示例代码吗?

vba pdf ms-access-2010 dde sumatra
1个回答
0
投票

最初使用 DDE 来控制 SumatraPDF 作为“预查看器”(这是一个误称,因为 PDF 总是在渲染后查看)由 William Blum 开发,主要在 2008 年与 LaTeX IDE 一起使用。它允许服务器:SUMATRA 主题:控制 WM_DDE_EXECUTE :命令[s]。

它现在是运行时导航的关键手段,因此通过命令行使用 SumatraPDF 打开文档“FileName”已经“主动服务”将使用 DDE CONTROL 来处理许多内部命令。如果不使用文件名运行,一旦启动正常运行,它将进行自助服务。

一个问题是 DDE 有一些 Windows 施加的限制。例如,如果非用户会话正在运行,则打开文件的用户命令行调用应该失败。如果运行混合 32 位和 64 位会话,则可能适用类似的限制。

插件“预览器”系统主要是为基于 Netscape 的浏览器设计的(2015 年已弃用),Office 中对资源管理器 PDF“预览器”的任何剩余使用(例如“MS Outlook”)是完全不受支持的遗留副作用。作为“沙盒”框架的“浏览器”窗格,它通过限制不安全的 UI 功能来限制其本机功能。

因此,DDE 通过一个狭窄的“控制”通道以一种方式工作,以公开外部驱动的功能。没有显着的手段来公开“内部”状态或数据。

已经对 DDE 查询提出了一些请求,例如“当前”页面或缩放状态,但没有这样的外部反馈设计机制。

如果您可以在用户选择上运行 VB 命令,则与 Windows 本地“Clip”命令或 WSH 发送键 CTRL + C 将用户选择复制到剪贴板没有什么不同。

© www.soinside.com 2019 - 2024. All rights reserved.