Как перехватить активацию формы (Word 2000)?

Программирование на Visual Basic for Applications
Goettsch
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 21.08.2007 (Вт) 1:44

Как перехватить активацию формы (Word 2000)?

Сообщение Goettsch » 21.08.2007 (Вт) 2:11

Здравствуйте!

Ситуация такая. В Word 2000 создал UserForm, вывожу её как НЕмодальную (formName.Show vbModeless), т.е. я могу переходить мышью из формы в сам текст в Word'е и обратно в форму. Так вот, мне надо перехватывать тот момент, когда форма получает фокус (т.е. когда я возвращаюсь из текста документа в форму).

Я пробовал делать это через событие формы _Activate, но это событие почему-то не срабатывает, возможно, я просто неправильно понимаю смысл этого события, но в Справке по VBA написано: «The Activate event occurs when an object becomes the active window.» При открытии формы (методом .Show см выше) это событие срабатывает, но при перемещении между Word'ом и формой — не срабатывает. Так и должно быть? Или я что-то не понимаю?!

Как бы то ни было, пожалуйста, объясните, как ловить получение фокуса формой.

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 22.08.2007 (Ср) 8:37

http://bbs.vbstreets.ru/viewtopic.php?t ... 01fead9f59
http://bbs.vbstreets.ru/viewtopic.php?p ... aa733269ad
""Попитка - нэ питка", да, товарищ Берия?" :D

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 23.08.2007 (Чт) 13:00

1. Попытался переделать пример MEMBERhttp://bbs.vbstreets.ru/viewtopic.php?p=37501 под VBA. Как будто получилось, НО пока щелкаешь в пределах окна приложения. Если кликнуть за пределами или даже по заголовку приложения - зависает.
В форме
Код: Выделить всё
Private Sub UserForm_Initialize()

    gWH = GetForegroundWindow
    OldWndProc = SetWindowLong(gWH, GWL_WNDPROC, AddressOf WindowProc)

End Sub

Private Sub UserForm_Terminate()

    SetWindowLong gWH, GWL_WNDPROC, OldWndProc

End Sub

и в модуле
Код: Выделить всё
Declare Function SetWindowLong Lib "user32" Alias _
        "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex _
        As Long, ByVal dwNewLong As Long) As Long

Declare Function CallWindowProc Lib "user32" Alias _
        "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
        ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam _
        As Long, ByVal lParam As Long) As Long
Declare Function GetForegroundWindow Lib "user32" _
() As Long

   
Public Const GWL_WNDPROC = -4
Public Const WM_ACTIVATE = &H6

Public gWH As Long
Public OldWndProc As Long
Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal _
                    wParam As Long, ByVal lParam As Long) As Long
    Dim lReturn As Long
    '
    lReturn = CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam)
    '
    Select Case Msg 'проверяем сообщения
        Case WM_ACTIVATE 'появилось меню
            If LoWord(wParam) <> 0 Then
                UserForm1.Caption = ":)"
            Else
                UserForm1.Caption = ":("
            End If
    End Select
    '
    WindowProc = lReturn
End Function
Private Function LoWord(DWORD As Long) As Integer
   If DWORD And &H8000& Then
      LoWord = &H8000 Or (DWORD And &H7FFF&)
   Else
      LoWord = DWORD And &HFFFF&
   End If
End Function
В чем причина - нужно ставить какое-нибудь условие или ошибку, или это в в VBA работать не будет?

2. Вопрос специалистам: перелопатил форум, но не попалось - можно ли в VBA сделать сабклассинг (форма/контролы)?
Вложения
Фокус формы.zip
(9.73 Кб) Скачиваний: 64


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 60

    TopList