Цель сего: сделать чтобы программа смогла реагировать на паузу.
В цикле выводится что-то подобное:
Object: !{0002E100-0000-0000-C000-000000000046}
Window: Project1 - Microsoft Visual Basic [design] - [Module1 (Code)]
Но почему-то находит только один открытый проект, да и то, не текущий. Может кто знает как не из Add-in получить объект VBIDE.VBE текущего проекта или как из Add-in передать VBIDE.VBE (или события BuildEvents) в сам проект?
DefLng N: DefStr S
Private WithEvents BuildEvents As VBBuildEvents
Private Sub Form_Load()
Dim pVBE As VBIDE.VBE, pEvents2 As Events2
Dim ctx As IBindCtx, pROT As IRunningObjectTable
Dim pEnumMoniker As IEnumMoniker, pMoniker As IMoniker
Set ctx = CreateBindCtx()
Set pROT = ctx.GetRunningObjectTable
Set pEnumMoniker = pROT.EnumRunning
pEnumMoniker.Reset
pEnumMoniker.Next 1, pMoniker
Do Until pMoniker Is Nothing
nStr = pMoniker.GetDisplayName(ctx, pMoniker)
s = TrimNull(SysAllocStringLen(nStr, 460))
Debug.Print "Object: "; s
If TypeOf pROT.GetObject(pMoniker) Is VBIDE.VBE Then
Set pVBE = pROT.GetObject(pMoniker)
Debug.Print " Window: "; pVBE.MainWindow.Caption
Set pEvents2 = pVBE.Events
Set BuildEvents = pEvents2.VBBuildEvents
End If
pEnumMoniker.Next 1, pMoniker
Loop
End Sub
Private Sub BuildEvents_EnterDesignMode()
Debug.Print "Design Mode"
End Sub
Private Sub BuildEvents_EnterRunMode()
Debug.Print "Enter Run Mode"
End Sub
Private Function TrimNull(s) As String
n = InStr(s, Chr$(0))
If n <> 0 Then
TrimNull = Left$(s, n - 1)
Else
TrimNull = s
End If
End Function
Ответить
|