Двойной щелчок по полю MacroButton не распознается VBA после закрытия модальной Windows формы - PullRequest
0 голосов
/ 06 марта 2020

Я разрабатываю надстройку для слов с помощью VSTO. На поверхности документа Word есть несколько полей MacroButton. Чтобы обратиться к событиям двойного щелчка полей, я использую макрос VBA в шаблоне (MyTestProject.dotm).

Это структура одного из полей: enter image description here

Когда коды полей скрыты, отображается как TESTTAG: Test1.

При двойном щелчке по сценарию TESTTAG: Test1, указанному ниже в пределах аргументов MyTestProject.dotm:

Public Sub TPS_TestTag()
    Set addIn = Application.COMAddIns("MyVSTO")
    Set automationObject = addIn.Object
    automationObject.HandleClickEvents
End Sub

У меня есть следующий метод в AddInUtilities.cs моего проекта VSTO:

public void HandleClickEvents()
{
    using (MyProject.Application app = new MyProject.Application())
    {
        app.ExecuteMacroClickEvents();  
    }
}

В методе app.ExecuteMacroClickEvents() я form.ShowDialog() метод для отображения модальной Windows формы.

При первом двойном щелчке по TESTTAG: Test1 появляется моя форма. Затем появляется TESTTAG: Test1:

enter image description here

Если я закрою форму и сразу же дважды дважды щелкните тег TESTTAG: Test1, не нажимая нигде иначе TPS_TestTag() в пределах MyTestProject.dotm не выполняется. Если я снова дважды щелкну по тегу, VBA выполнится и покажет диалоговое окно. Если я снова закрою диалоговое окно и продолжу выполнять двойной щелчок, диалоговое окно не будет отображаться, в следующей попытке отобразится диалоговое окно. Это же поведение продолжится.

С другой стороны, при использовании метода form.Show() для отображения Windows Форма, в которой проблема не возникает.

Вы можете использовать описанный ниже метод в AddInUtilities.cs в проекте VSTO, чтобы повторить эту проблему.

public void HandleClickEvents()
{
    Form objForm = new Form(); 
    objForm.Width = 300;
    objForm.Height = 300;
    //objForm.Show();      /* This doesn't give the issue */
    objForm.ShowDialog();  /* This gives the issue */
}

Теперь мой вопрос:

Мне действительно нужно использовать метод objForm.ShowDialog(), чтобы показать диалоговое окно, и в то же время мне нужно, чтобы диалоговое окно появлялось при каждом двойном - нажмите на поле TESTTAG: Test1 MacroButton без сбоев.

Обновление

При повторном тестировании обнаружилось, что после двойного щелчка документ находится в режиме, подобном «неактивному». Когда я щелкаю один раз в каком-либо месте документа, я снова могу дважды щелкнуть. Я попробовал приведенные ниже коды в классе AddInUtilities, а также в методе TPS_TestTag() VBA. Но ни один из них не сработал.

object word = System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
wordApp = (Word.Application)word;    
wordApp.ActiveDocument.Activate(); //or
wordApp.ActiveDocument.ActiveWindow.ActivePane.Selection.Select();

VB код

Public Sub TPS_TestTag()
    Set addIn = Application.COMAddIns("MyVSTO")
    Set automationObject = addIn.Object
    automationObject.HandleClickEvents
    Word.ActiveDocument.Activate
End Sub

Как это решить?

1 Ответ

0 голосов
/ 12 марта 2020

Найден ответ.

Должен ли вызываться метод SetFocus для активного документа в классе AddInUtilities.cs сразу после завершения выполнения соответствующего кода.

public void HandleClickEvents()
{
    using (MyProject.Application app = new MyProject.Application())
    {
        app.ExecuteMacroClickEvents();  
        Globals.ThisAddIn.Application.ActiveWindow.SetFocus();
    }
}

или изменение кода VBA ,

Public Sub TPS_TestTag()
    Set addIn = Application.COMAddIns("MyVSTO")
    Set automationObject = addIn.Object
    automationObject.HandleClickEvents
    word.Application.ActiveWindow.SetFocus
End Sub

Ссылка: Последний комментарий на этом форуме

...