SendKeys не всегда работает
Я использую .SendKeys()
в Excel VBA для отправки нажатий клавиш во внешнее окно, которое я делаю активным с помощью оболочки .AppActive
метод. Проблема в том, что SendKeys
просто не ведет себя последовательно и иногда отправляет ключи, а иногда нет. Я думаю, что это связано с хранением ключей в буфере в соответствии с документацией MSDN.
Как обойти это?
2 ответа
Я обнаружил, что решением этой проблемы было просто приостановить приложение на короткое время. Похоже, что это позволяет очистить буфер (поправьте меня, если я ошибаюсь, пожалуйста).
Чтобы заставить Excel VBA спать, я выставил функцию Windows API Sleep
написав в верхней части модуля:
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
А потом после каждого SendKeys
Команда, которую я только что использовал:
Sleep 1
И буквально, 1 миллисекунда имела все значение, и ключи всегда отправлялись правильно.
Вы можете рассмотреть возможность использования Autoit, который является более надежным, чем SendKeys.
Загрузите Autoit по ссылке ниже http://www.autoitscript.com/site/autoit/downloads/
Добавить в ссылку autoitaddin AutoItX3 1.0 Библиотека типов
Ниже приведен пример кода, который откроет калькулятор и введите 123456789
Sub sendkeys()
'Open a calc
StartCalculator
Dim au As New AutoItX3Lib.AutoItX3
au.AutoItSetOption "WinTitleMatchMode", 2
au.WinActivate "Calculator"
'send key strokes
au.ControlClick "Calculator", "", "Button5"
au.ControlClick "Calculator", "", "Button11"
au.ControlClick "Calculator", "", "Button16"
au.ControlClick "Calculator", "", "Button4"
au.ControlClick "Calculator", "", "Button10"
au.ControlClick "Calculator", "", "Button15"
au.ControlClick "Calculator", "", "Button3"
au.ControlClick "Calculator", "", "Button9"
au.ControlClick "Calculator", "", "Button14"
End Sub
Sub StartCalculator()
Dim Program As String
Dim TaskID As Double
On Error Resume Next
Program = "calc.exe"
TaskID = Shell(Program, 1)
If Err <> 0 Then
MsgBox "Can't start " & Program
End If
End Sub