SendKeys не всегда работает

Я использую .SendKeys() в Excel VBA для отправки штрихов клавиш во внешнее окно, которое я делаю активным с помощью shell .AppActive метод. Проблема в том, что SendKeys просто не ведет себя последовательно и иногда отправляет ключи, а иногда и нет. Я думаю, что это имеет какое-то отношение к хранению ключей в буфере в соответствии с документацией MSDN.

как обойти это?

2 ответов


вы можете использовать Autoit, который более надежен, чем SendKeys.

загрузить Autoit из ссылки ниже http://www.autoitscript.com/site/autoit/downloads/

добавить в ссылку autoit addin 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

enter image description here


я обнаружил, что решение этой проблемы состояло в том, чтобы просто сделать паузу приложения на короткое время. Это, кажется, позволяет буферу очистить (поправьте меня, если я ошибаюсь, пожалуйста).

чтобы сделать Excel VBA sleep, я выставил функцию Windows API Sleep написав в верхней части модуля:

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

а потом после каждого SendKeys команда, я просто использовал:

Sleep 1

и буквально, 1 миллисекунда сделала всю разницу, и ключи всегда были отправлено правильно.