Отправить команду DDE в PDF-документ в SUMATRA PDF в подчиненной форме

У меня есть приложение 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

Это работает нормально. Однако я хотел бы взаимодействовать с PDF-документом из моего приложения VBA с помощью команд DDE (Sumatra PDF поддерживает DDE начиная с версии 3.5).

Если я запускаю Суматру как приложение, я могу использовать этот пример кода для отправки команды выбора копии:

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

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

End Sub

Поскольку Суматра загружается в подчиненную форму, доступное приложение Суматра отсутствует, поэтому инициализация DDE завершается неудачно. Однако Суматра протекает как процесс...

Существует также усложняющий фактор: у моих пользователей может быть открыто несколько экземпляров средств просмотра PDF в подчиненных формах, а в приложении есть несколько пользователей, которые могут открывать средства просмотра PDF одновременно.

Мой вопрос: есть ли способ определить правильный канал DDE для процесса Суматры, который выполняется в моей подформе? Могу ли я использовать для этого вызов API, используя Hwnd подчиненной формы? Если это возможно, можете ли вы дать мне пример кода?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первоначальное использование DDE для управления SumatraPDF в качестве «предварительного просмотра» (неправильное название, поскольку PDF всегда просматривается после рендеринга) было разработано Уильямом Блюмом для использования с LaTeX IDE (WinEdt) в основном в 2008 году. Это позволяет использовать сервер: SUMATRA Тема: управление WM_DDE_EXECUTE: Команда[ы].

Теперь это ключевое средство навигации во время выполнения, поэтому открытие документа «Имя файла» через командную строку с SumatraPDF, уже «активно обслуживающим», будет использовать DDE CONTROL для обработки многих внутренних команд. Если он не работает с именем файла, он будет самообслуживаться после начала нормальной работы.

Одна из проблем заключается в том, что DDE имеет несколько ограничений, налагаемых Windows. Например, если запущен непользовательский сеанс, вызов пользовательской командной строки для открытия файла должен завершиться неудачей. Аналогичные ограничения UAC могут применяться при запуске смешанных 32-битных и 64-битных сеансов.

Система подключаемого модуля «Предварительный просмотр» была в первую очередь разработана для браузеров на базе Netscape (устарела в 2015 г.), и любое остаточное использование «Предварительных просмотров» PDF-файлов в Explorer, таких как «MS Outlook», является полностью неподдерживаемым устаревшим побочным эффектом. Поскольку панель «Браузер» находится в «песочнице», ее собственные возможности ограничены за счет ограничения небезопасных функций пользовательского интерфейса.

В режиме Plug-in не должно быть внешнего управления.

Таким образом, DDE работает в одном направлении через один узкий канал «управления», предоставляя внешние функциональные возможности. Не существует существенных средств для раскрытия «внутренних» состояний или данных.

Было сделано несколько запросов для запроса DDE, например, «Текущая» страница или состояние масштабирования, но такого внешнего механизма обратной связи не существует.

Если вы можете запустить команду VB при выборе пользователя, она ничем не будет отличаться от собственной команды Windows «Clip» или клавиши отправки WSH CTRL + C для копирования выбора пользователя в буфер обмена.

Привет, KJ, Спасибо за подробное объяснение. Теперь я понимаю, почему это не сработает. Я уже сталкивался с этим: «если запущен непользовательский сеанс, вызов пользовательской командной строки для открытия файла должен завершиться неудачей». Это тоже теперь объяснено. Мне по-прежнему повезло, что «неподдерживаемый побочный эффект устаревшей формы» сработал для меня, позволив средству просмотра находиться в подчиненной форме, что сделало ее частью приложения. Еще раз спасибо, с уважением, Эмфирио.

emphyrio 28.06.2024 09:01

Другие вопросы по теме