LockWindowsUpdate работает в Office 2010, но не в Office 2016 - PullRequest
0 голосов
/ 10 октября 2018

В течение некоторого времени я использовал 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)

...