我有以下代码,可以正常工作,但仅当用户正在查看屏幕时才有效。我需要找到一种实现相同结果的解决方案,但是在屏幕锁定时可以使用。我知道SendKeys
在屏幕锁定时不起作用。
我不能使用vntAddIn.Connect = True
,因为这会导致错误。可以使用对话框手动成功启用COM加载项,但不能通过.Connect
属性成功启用。
我相信我可以使用SendMessage
或PostMessage
API来实现此目的,但是我不确定如何做到这一点。我不确定要使用哪个窗口句柄(例如,它是主要的Excel应用程序?),并且我不知道如何发送Alt组合吗?任何帮助将不胜感激。
注意,我知道使用 PAGE DOWN 到达列表底部并不可靠,因为如果Com加载项不是列表中的最后一项,它可能会失败。我有一个单独的解决方案来确定加载项在列表中的何处出现,并且可以使用特定数量的 DOWN 箭头替换 PAGE DOWN 来解决此问题,但要在实施之前为此,我想确保一切皆有可能,因为在屏幕锁定时无法执行此操作,毫无意义。
Public Sub EnableComAddIn()
Dim blnAddInIsConnected As Boolean
Dim vntAddIn As Variant
Const CstrComAddinDescription As String = "Oracle Smart View for Office"
blnAddInIsConnected = False
For Each vntAddIn In ThisWorkbook.Application.COMAddIns
If vntAddIn.Description = CstrComAddinDescription Then
blnAddInIsConnected = vntAddIn.Connect
Exit For
End If
Next
If Not blnAddInIsConnected Then
'Make sure Excel application window is active, and a cell is selected.
ThisWorkbook.Activate
ThisWorkbook.Worksheets(1).Select
ThisWorkbook.Worksheets(1).Cells(1, 1).Select
'Make sure Developer tab is shown on ribbon or Alt-L will not work.
ThisWorkbook.Application.ShowDevTools = True
'Use SendKeys to use ALT-L, J to open Com Add-ins window, page down twice to select last entry on list, press space to check the box, press Enter to save.
DoEvents
ThisWorkbook.Application.Wait Now() + TimeSerial(0, 0, 1)
DoEvents
ThisWorkbook.Application.SendKeys "%LJ{PGDN}{PGDN} {ENTER}", True
DoEvents
ThisWorkbook.Application.Wait Now() + TimeSerial(0, 0, 1)
DoEvents
End If
End Sub