Базовый пример SendInput VB

Я надеюсь, что кто-то может помочь, я пытаюсь найти пример кода SendInput, который имитирует команды клавиатуры, я хочу найти окно блокнота и ввести тестовое сообщение.

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

Я надеюсь, что кто-то может помочь, примеры в Интернете, похоже, не работают.

Может ли кто-нибудь также посоветовать, является ли метод SendInput навязчивым, т.е. не приведет ли он к повреждению окна получателя.

Метод SendKey сработал, однако надежность кажется очень удачной.

Огромное спасибо

Сара

Редактировать:

Я нашел следующий код в Интернете, следующий метод SendInput? Как я заметил, что используется термин «SendKey»?

Private Declare Function SendInput Lib "user32.dll" _
 (ByVal nInputs As Long, ByRef pInputs As Any, _
 ByVal cbSize As Long) As Long
Private Declare Function VkKeyScan Lib "user32" Alias "VkKeyScanA" _
 (ByVal cChar As Byte) As Integer

Private Type KeyboardInput      '   typedef struct tagINPUT {
 dwType As Long                '     DWORD type;
 wVK As Integer                '     union {MOUSEINPUT mi;
 wScan As Integer              '               KEYBDINPUT ki;
 dwFlags As Long               '               HARDWAREINPUT hi;
 dwTime As Long                '              };
 dwExtraInfo As Long           '     }INPUT, *PINPUT;
 dwPadding As Currency         '   8 extra bytes, because mouses take more.
End Type

Private Const INPUT_MOUSE As Long = 0
Private Const INPUT_KEYBOARD As Long = 1
Private Const KEYEVENTF_KEYUP As Long = 2
Private Const VK_LSHIFT = &HA0

Public Sub SendKey(ByVal Data As String)
Dim ki() As KeyboardInput
Dim i As Long
Dim o As Long ' output buffer position
Dim c As String ' character

ReDim ki(1 To Len(Data) * 4) As KeyboardInput
o = 1

For i = 1 To Len(Data)
 c = Mid$(Data, i, 1)
 Select Case c
   Case "A" To "Z": ' upper case
     ki(o).dwType = INPUT_KEYBOARD 'shift down
     ki(o).wVK = VK_LSHIFT
     ki(o + 1) = ki(o) ' key down
     ki(o + 1).wVK = VkKeyScan(Asc(c))
     ki(o + 2) = ki(o + 1) ' key up
     ki(o + 2).dwFlags = KEYEVENTF_KEYUP
     ki(o + 3) = ki(o) ' shift up
     ki(o + 3).dwFlags = KEYEVENTF_KEYUP
     o = o + 4
   Case Else: ' lower case
     ki(o).dwType = INPUT_KEYBOARD
     ki(o).wVK = VkKeyScan(Asc(c))
     ki(o + 1) = ki(o)
     ki(o + 1).dwFlags = KEYEVENTF_KEYUP
     o = o + 2
 End Select
Next i

Debug.Print SendInput(o - 1, ki(1), LenB(ki(1))),
Debug.Print Err.LastDllError
End Sub

Private Sub Command1_Click()
Text1.Text = ""
Text1.SetFocus
DoEvents
Call SendKey("This Is A Test")
End Sub

person sara2011    schedule 15.12.2012    source источник
comment
Не работает с 64-битной, даже при добавлении PtrSafe.   -  person wtjones    schedule 31.10.2013


Ответы (2)


Следующий код предназначен не для VB.net, а для VB/VBA, он похож на метод sendkeys, но, вероятно, немного более надежен, поскольку он отправляет ключи специально для целевого приложения. (сообщение, где я его получил, также показывает метод sendkeys)

Public Declare Function FindWindowX Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, ByVal lpsz1 As Long, ByVal lpsz2 As Long) As Long

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, _
ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Integer) As Long

Private Const WM_KEYDOWN = &H100
Private Const WM_KEYUP = &H101

Sub Three()
    hWind = FindWindow(vbNullString, "Untitled - Notepad")
    cWind = FindWindowX(hWind, 0, 0, 0)
    Debug.Print PostMessage(cWind, WM_KEYDOWN, vbKeyA, 0)
    Debug.Print PostMessage(cWind, WM_KEYDOWN, vbKeyB, 0)
    Debug.Print PostMessage(cWind, WM_KEYDOWN, vbKeyC, 0)
End Sub

Код взят из это сообщение на форуме

Если вы вставите это в новый модуль в Excel/VBA и запустите новый экземпляр блокнота, при выполнении подпрограммы в блокноте должно появиться «abc».

Я не понимаю, как использовать это или метод sendkeys может «повредить» целевое окно. До тех пор, пока вы правильно рассчитываете сообщения (не отправляя тонны символов в окно одновременно), это не должно вызывать никаких проблем.

person NickSlash    schedule 16.12.2012
comment
Спасибо, Ник, сейчас мне нужен метод SendInput вместо SendMessage или PostMessage. - person sara2011; 16.12.2012

Мне удалось найти еще один скрипт SendInput в Интернете, я скопировал его ниже для всех, кому это может быть интересно.

Я использую SendKeys для копирования данных из электронной таблицы и ввода их в систему на работе, это экономит драгоценное время, поскольку необходимо ввести огромное количество информации.

Функция SendKeys работала без каких-либо проблем (хотя из-за проблем с надежностью мне пришлось рассмотреть альтернативы), вызовет ли SendInput какие-либо проблемы с другим окном, т.е. кроме имитации кнопок клавиатуры, будет ли он мешать каким-либо другим функциям целевого окна?

Private Declare Function SendInput Lib "user32.dll" _
 (ByVal nInputs As Long, ByRef pInputs As Any, _
 ByVal cbSize As Long) As Long
Private Declare Function VkKeyScan Lib "user32" Alias "VkKeyScanA" _
 (ByVal cChar As Byte) As Integer

Private Type KeyboardInput      '   typedef struct tagINPUT {
 dwType As Long                '     DWORD type;
 wVK As Integer                '     union {MOUSEINPUT mi;
 wScan As Integer              '               KEYBDINPUT ki;
 dwFlags As Long               '               HARDWAREINPUT hi;
 dwTime As Long                '              };
 dwExtraInfo As Long           '     }INPUT, *PINPUT;
 dwPadding As Currency         '   8 extra bytes, because mouses take more.
End Type

Private Const INPUT_MOUSE As Long = 0
Private Const INPUT_KEYBOARD As Long = 1
Private Const KEYEVENTF_KEYUP As Long = 2
Private Const VK_LSHIFT = &HA0

Public Sub SendKey(ByVal Data As String)
Dim ki() As KeyboardInput
Dim i As Long
Dim o As Long ' output buffer position
Dim c As String ' character

ReDim ki(1 To Len(Data) * 4) As KeyboardInput
o = 1

For i = 1 To Len(Data)
 c = Mid$(Data, i, 1)
 Select Case c
   Case "A" To "Z": ' upper case
     ki(o).dwType = INPUT_KEYBOARD 'shift down
     ki(o).wVK = VK_LSHIFT
     ki(o + 1) = ki(o) ' key down
     ki(o + 1).wVK = VkKeyScan(Asc(c))
     ki(o + 2) = ki(o + 1) ' key up
     ki(o + 2).dwFlags = KEYEVENTF_KEYUP
     ki(o + 3) = ki(o) ' shift up
     ki(o + 3).dwFlags = KEYEVENTF_KEYUP
     o = o + 4
   Case Else: ' lower case
     ki(o).dwType = INPUT_KEYBOARD
     ki(o).wVK = VkKeyScan(Asc(c))
     ki(o + 1) = ki(o)
     ki(o + 1).dwFlags = KEYEVENTF_KEYUP
     o = o + 2
 End Select
Next i

Debug.Print SendInput(o - 1, ki(1), LenB(ki(1))),
'Debug.Print Err.LastDllError
End Sub

Private Sub Command1_Click()
Text1.Text = ""
Text1.SetFocus
DoEvents
Call SendKey("This Is A Test")
End Sub
person sara2011    schedule 16.12.2012
comment
Это прекрасно работало и в MS Access, спасибо! - person ; 06.03.2019