SendInput VB基本示例

我希望有人可以协助,我试图find一个模拟键盘命令的SendInput代码的例子,我希望find记事本窗口并input一个testing消息。

我最初在一个正在使用的项目中使用SendKeys,SendKeys函数使我能够将键盘命令转发到我们在工作场所使用的定制软件。

我希望有人可以帮忙,互联网上的例子似乎并没有工作。

任何人也可以build议,如果SendInput方法是侵入性的,即它会造成任何损害的收件人窗口。

SendKey方法工作,但可靠性似乎非常打击和错过。

非常感谢

萨拉

编辑:

我在网上find了下面的代码,下面是一个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 

以下代码不适用于VB.net,而是VB / VBA,它类似于sendkeys方法,但可能更为可靠,因为它将密钥专门发送到目标应用程序。 (我得到它的post也显示了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 

代码来自这个论坛post

如果您将其粘贴到Excel / VBA中的新模块中,并且有一个新的记事本实例正在运行,则在执行子文件时,“abc”应该出现在记事本中。

我没有看到如何使用它,或者sendkeys方法可能会“损害”目标窗口。 只要你正确的时间消息(不是同时发送吨的字符到窗口),它不应该引起任何问题。

我已经设法find另一个SendInput脚本在线,我已经复制下面的任何其他人可能有兴趣。

我一直在使用SendKeys从电子表格复制数据,并在工作的系统上input这些数据,这样可以节省宝贵的时间,因为需要input大量的信息。

SendKeys函数工作没有任何问题(虽然由于可靠性问题,我不得不考虑替代品),SendInput会导致任何问题到另一个窗口,即除了模拟键盘button会干扰目标窗口的任何其他function?

 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