Пользователь не может взаимодействовать с открытым программным способом документом Word, пока не нажмет Ctrl+Home. ЛентаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Пользователь не может взаимодействовать с открытым программным способом документом Word, пока не нажмет Ctrl+Home. Лента

Сообщение Anonymous »

Некоторые из наших пользователей недавно начали жаловаться на то, что, открыв документы Word через наше приложение, они не могут с ними взаимодействовать. Когда они пытаются прокрутить документ вверх и вниз с помощью вертикальной полосы прокрутки, полоса прокрутки перемещается нормально, но документ вообще не перемещается. Ленточный бар полностью доступен. Когда пользователь щелкает в любом месте документа, «ничего не происходит».
Но на самом деле с документом все в порядке. В тот момент, когда вы нажимаете на клавиатуру, чтобы ввести любую букву, буква появляется, и с этого момента документ ведет себя нормально. Если вы нажмете Ctrl+Home, курсор начнет мигать в начале документа и начнет вести себя нормально. Вы даже можете нажимать кнопки на ленточной панели, и многие действия приведут к тому, что документ снова станет доступным. Даже простые действия, такие как увеличение или уменьшение документа, решат проблему.
Поэтому мне кажется, что когда документ открывается, «фокус» перемещается туда, куда не следует, и любые из этих действий вернут его в более разумное место в документе, после чего пользователь сможет снова с ним взаимодействовать.
После некоторого расследования я обнаружил, что документы-нарушители, похоже, имеют одну общую функцию. : в них есть сноски.
Код, который мы используем для открытия документа, кажется довольно простым:
Мы создаем объект Word.Application и используйте его метод Open, чтобы открыть документ (код VB)

Код: Выделить всё

    oDoc = oWApp.Documents.Open()
Мы добавляем код, чтобы обеспечить видимость Word для пользователя (при необходимости) или для активации приложения

Код: Выделить всё

oWapp.Visible = True
oWApp.Activate()
Мы избегаем странных настроек панели

Код: Выделить всё

If oWapp.ActiveWindow.View.SplitSpecial = Microsoft.Office.Interop.Word.WdSpecialPane.wdPaneNone Then
If oWapp.ActiveWindow.ActivePane.View.Type = Microsoft.Office.Interop.Word.WdViewType.wdWebView Then
oWapp.ActiveWindow.ActivePane.View.Type = Microsoft.Office.Interop.Word.WdViewType.wdPrintView
End If
Else
If oWapp.ActiveWindow.View.Type = Microsoft.Office.Interop.Word.WdViewType.wdWebView Then
oWapp.ActiveWindow.View.Type = Microsoft.Office.Interop.Word.WdViewType.wdPrintView
End If
End If
И наконец активируем документ

Код: Выделить всё

oWapp.ActiveDocument.Activate()
Это всегда работало нормально, но мы заметили одну вещь: люди, которые начали жаловаться, использовали Office версии 2409, сборка 16.0.18025.20160, 64-разрядная версия. Я тоже, и я могу воспроизвести проблему на своем компьютере.
Когда я делаю это с документом без сносок, все ведет себя как всегда. Документ открывается и активируется, и пользователь может сразу же прокрутить и щелкнуть тело документа. Пока что похоже, что это влияет только на документы со сносками.
На данный момент я внес одно незначительное изменение, которое, кажется, позволяет избежать проблемы... но оно некрасиво. Мне не нравится полагаться на спящий поток, чтобы что-то работало, поэтому я запрограммировал его так, чтобы он делал это только тогда, когда в документе действительно есть сноски или концевые сноски. У нас пока нет возможности протестировать это на машине клиента. Вместо простой активации активного документа мы теперь добавляем код для проверки сносок или концевых сносок и приостанавливаем поток на секунду. После активации документа мы программно эмулируем нажатие пользователем Ctrl+Home. Я не могу выразить, как сильно я ненавижу эту мешанину.

Код: Выделить всё

Try
Dim bSleptAlready As Boolean = False
If DirectCast(oWapp.ActiveDocument, Microsoft.Office.Interop.Word.Document).Footnotes IsNot Nothing Then
If DirectCast(oWapp.ActiveDocument, Microsoft.Office.Interop.Word.Document).Footnotes.Count > 0 Then
bSleptAlready = True
System.Threading.Thread.Sleep(1000)
End If
End If
If Not bSleptAlready Then
If DirectCast(oWapp.ActiveDocument, Microsoft.Office.Interop.Word.Document).Endnotes IsNot Nothing Then
If DirectCast(oWapp.ActiveDocument, Microsoft.Office.Interop.Word.Document).Endnotes.Count > 0 Then
bSleptAlready = True
System.Threading.Thread.Sleep(1000)
End If
End If
End If
oWapp.ActiveDocument.Activate()
If bSleptAlready Then
DirectCast(oWapp, Microsoft.Office.Interop.Word.Application).Selection.HomeKey(Unit:=Microsoft.Office.Interop.Word.WdUnits.wdStory)
DirectCast(oWapp, Microsoft.Office.Interop.Word.Application).ActiveWindow.ActivePane.VerticalPercentScrolled = 0
End If
Catch ex As Exception

End Try
Мне хотелось бы найти ответы на любой из этих вопросов:[/b]
  • Является ли кто-нибудь знает, что об этом сообщалось как о проблеме с недавним обновлением Microsoft Word? (Я также задавал этот вопрос Microsoft, и если они дадут мне ответ, я опубликую его здесь)
  • Если кто-нибудь сталкивался с этим раньше, есть ли способ программно обнаружить наличие сносок и выполнить какие-либо программные действия, чтобы избежать этой проблемы? Мы советовали людям «просто нажмите Ctrl+Home», но, видимо, даже такая простая инструкция для некоторых не под силу.


Подробнее здесь: https://stackoverflow.com/questions/791 ... they-hit-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»