gpt4 book ai didi

excel - SendInput VB 基本示例

转载 作者:行者123 更新时间:2023-12-01 06:42:57 32 4
gpt4 key购买 nike

我希望有人可以提供帮助,我试图找到一个模拟键盘命令的 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

最佳答案

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

代码取自 this论坛帖子

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

我不明白如何使用它,或者 sendkeys 方法会“损坏”目标窗口。只要您正确安排消息的时间(不是同时向窗口发送大量字符),它就不会引起任何问题。

关于excel - SendInput VB 基本示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13896658/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com