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

Другие вопросы по тегам