View Full Version : Locking Word

Howard Kaikow
04-17-2005, 02:18 PM
When I lock the Word app window with the code below, the lock does not hold
unless I put a breakpoint on, say, the With appWord statement following the
commented out Sleep statement.

Since it worked using a breakpoint, I ASSuMEd that I could use Sleep to
achieve the same effect. Well, I tried Sleep 20000 and that did no good.

What do I have to do to make sure the Lock works?
The code will evetually be part of a .exe or .dll, so cannot rely on manual

I am running the code on VB 6, but I expect that the locking issue would occur no matter the host app.

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

Private Declare Function GetWindowText Lib "user32" _
Alias "GetWindowTextA" _
(ByVal hWnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long

Private Declare Function GetActiveWindow Lib "user32" () As Long

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub btnByeBye_Click()
Unload Me
End Sub

Private Sub btnNoTemplate_Click()
Dim appWord As Word.Application
Dim docWord As Word.Document
Dim lngHWnd As Long
Dim lngReturn As Long
Dim strCaption As String

Set appWord = New Word.Application
lngHWnd = FindWindow(vbNullString, "Microsoft Word")
If lngHWnd = 0 Then
Debug.Print "Not found"
Set appWord = Nothing
Unload Me
Exit Sub
Debug.Print "Handle is" & Str(lngHWnd)
Debug.Print "Caption is: " & ActiveWindowCaption(lngHWnd)
lngReturn = LockWindowUpdate(lngHWnd)
If lngReturn = 0 Then
Debug.Print "Lock failed"
Set appWord = Nothing
Unload Me
Exit Sub
Debug.Print "Lock success:" & Str(lngReturn) & Str(lngHWnd)
End If
End If

' Sleep 1000
With appWord
.ScreenUpdating = False
.Visible = False
.WindowState = wdWindowStateMinimize

' Blob appears
Set docWord = .Documents.Add(Visible:=False)
With docWord
' Makes blob disappear
.ActiveWindow.Visible = False
' Do stuff here
End With
' Blob appears, then goes away
End With
Set docWord = Nothing
Set appWord = Nothing
End Sub

Private Function ActiveWindowCaption(Optional hWnd = -1) As String
' Return caption for active window.
Dim strCaption As String
Dim lngLen As Long

If hWnd = -1 Then
hWnd = GetActiveWindow()
End If

strCaption = String$(255, vbNullChar)
lngLen = Len(strCaption)

If (GetWindowText(hWnd, strCaption, lngLen) > 0) Then
ActiveWindowCaption = strCaption
ActiveWindowCaption = ""
End If
End Function