В течение некоторого времени я использовал API-интерфейс LockWindowUpdate для предотвращения мерцания экрана и ускорения выполнения кода в MS Word.Он работает в Office 2010 (64-разрядная версия).
Он не работает должным образом в Office 2016 (ни 32-разрядная, ни 64-разрядная версия), и я не знаю, как решить - любые советы, хитрости,или объяснения приветствуются.
#If Win64 And VBA7 Then
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function LockWindowUpdate Lib "user32" (ByVal hWndLock As LongPtr) As LongPtr
#Else
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassname As String, ByVal lpWindowName As String) As Long
Private Declare Function LockWindowUpdate Lib "user32" (ByVal hWndLock As Long) As Long
#End If
Следующее работает в MS Word 2010, но не в Word 2016, на обоих компьютерах работает Win 10. AFAICT, вызов FindWindow НЕ является проблемой, я подтвердил, что docHandle
получает ненулевое значение.
Public Sub FreezeWord()
#If VBA7 Then
Dim docHandle As LongPtr
#Else
Dim docHandle As Long
#End If
' OpusApp = code name for MS Word
docHandle = FindWindow("OpusApp", Application.ActiveDocument.Name & " - " & Application.Caption)
If CBool(docHandle) Then
LockWindowUpdate docHandle ' Does not work: 32 bit, Word 2016
End If
End Sub
Ссылка для получения дополнительной информации: http://www.cpearson.com/excel/vbe.aspx (прокрутите вниз до: Устранение мерцания экрана во время кода VBProject)