在mouse_event和keybd_event不推荐使用的时候,用sendinput代替。

'声明的是sendinput,但是方法名改成sendmouseinput
Public Declare PtrSafe Function SendMouseInput Lib "user32.dll" Alias "SendInput" (ByVal cInputs As Long, ByRef pInputs As InputMouse, ByVal cbSize As Integer) As Long
'声明的是sendinput,但是方法名改成sendkeyinput
Public Declare PtrSafe Function SendKeybdInput Lib "user32.dll" Alias "SendInput" (ByVal cInputs As Long, ByRef pInputs As InputKeybd, ByVal cbSize As Integer) As Long
'nlnprts: 定义plnputs指向的结构的数目?
'plnputs: 指向INPUT结构数组的指针?每个结构代表插人到键盘或鼠标输入流中的一个事件?
'cbSize:定义INPUT结构的大小。若cbSize不是INPUT结构的大小,则函数调用失败。
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'创建一个类型,用来表示mouse的
Type InputMouse
    InputType As Long '输入类型,0代表鼠标,1代表键盘,2代表硬件,个人觉得可能算触屏或者其他之类的
    dx As Long 'X轴坐标
    dy As Long 'Y轴坐标
    mouseData As Long '是鼠标滚轮滚动值
    '指定鼠标所进行的操作,1代表移动,2代表左键按下,4代表左键抬起,8代表右键按下,16代表右键抬起,32代表中键按下,64代表中键抬起
    '128代表X按钮按下,256代表X按钮抬起,这里的X按钮我猜是触屏之类的,我没办法验证,其他大佬知道的话,可以告诉我一下
    '2048代表上下滚动,4096代表左右滚动
    dwFlags As Long
    time As Long '时间戳,可以使用API函数GetTickCount的返回值。一般情况用不上
    dwExtraInfo As LongPtr 'd扩展信息,可以使用API函数GetMessageExtraInfo的返回值。一般情况用不上
End Type
'创建一个类型,用来表示keybd的
Type InputKeybd
    InputType As Long
    wVk As Integer
    wScan As Integer
    dwFlags As Long
    time As Long '时间戳,可以使用API函数GetTickCount的返回值。一般情况用不上
    dwExtraInfo As LongPtr 'd扩展信息,可以使用API函数GetMessageExtraInfo的返回值。一般情况用不上
    '添加8个字节以达到与InputMouse相同的大小,不添加无正常使用InputKeybd,添加后无须使用
    'InputKeybd比InputMouse,多了4个字节,wVk、wScan(integer每个变量2个字节),少了12个字节,dx、dy、mouseData(long每个变量4个字节)
    '整体上少了8个字节,最后填充一个8个字节的currency,与InputMouse保持一致
    padding As Currency
End Type
Sub main()
    '移动
    Call MMouse(31000, 27000)
    '左键单击
    Call LMouse
    '163为左ctrl,86为V,ctrl+v,实现粘贴的功能
    '目前直接使用虚拟键码的值,这个可以百度到的,保持现状,容易让大家理解代码,以后有需求再改
    Call Keybds(163, 86)
    Call Keybd(78) 'n
    Call Keybd(66) 'b
End Sub
Sub LMouse() '左键单击,连续调用可以实现左键双击
    Dim LeftMouse As InputMouse
    LeftMouse.InputType = 0 '代表是鼠标
    LeftMouse.dwFlags = 2 '左键按下
    SendMouseInput 1, LeftMouse, LenB(LeftMouse) ' 1 表示LeftMouse是一组,LenB返回用于表示此字符串的字节的数目,而不是返回字符串中的字符数len
    LeftMouse.dwFlags = 4 '左键抬起
    SendMouseInput 1, LeftMouse, LenB(LeftMouse) ' 1 表示LeftMouse是一组,LenB返回用于表示此字符串的字节的数目,而不是返回字符串中的字符数len
End Sub
Sub RMouse() '右键单击,连续调用可以实现右键双击
    Dim RightMouse As InputMouse
    RightMouse.InputType = 0 '代表是鼠标
    RightMouse.dwFlags = 8 '
    右键按下
    SendMouseInput 1, RightMouse, LenB(RightMouse) ' 1 表示RightMouse是一组,LenB返回用于表示此字符串的字节的数目,而不是返回字符串中的字符数len
    RightMouse.dwFlags = 16 '右键抬起
    SendMouseInput 1, RightMouse, LenB(RightMouse) ' 1 表示RightMouse是一组,LenB返回用于表示此字符串的字节的数目,而不是返回字符串中的字符数len
End Sub
Sub MMouse(MoveX As Long, MoveY As Long) '移动鼠标,传递鼠标的X轴和Y轴的坐标就可以实现快速移动,关于拖动,目前没有需求,不搞
    Dim MoveMouse As InputMouse
    MoveMouse.InputType = 0 '代表是鼠标
    MoveMouse.dx = MoveX
    MoveMouse.dy = MoveY
    '改成&H8000&,强制long类型,或者是直接使用&H8000的十进制 32768,加上1也就是,&H8001&绝对值移动
    'https://www.csdn.net/p/398815977,这个网址有大佬的具体解释,非常厉害的大佬
    MoveMouse.dwFlags = 32769 '1表示是移动不过是相对与上个鼠标的位置进行移动,32769是绝对移动,与上个鼠标位置无关 &H8001&也是绝对值移动
    SendMouseInput 1, MoveMouse, LenB(MoveMouse) ' 1 表示MoveMouse是一组,LenB返回用于表示此字符串的字节的数目,而不是返回字符串中的字符数len
End Sub
Sub Keybds(Target1 As Long, Target2 As Long)
    Dim InputKeybds(1 To 2) As InputKeybd
    InputKeybds(1).InputType = 1 ' 表示键盘输入
    InputKeybds(1).wVk = Target1 '按下第一个键
    InputKeybds(1).dwFlags = 0 '按下键,1也可以按下但是不知道为什么会出错,建议用0
    InputKeybds(2).InputType = 1 ' 表示键盘输入
    InputKeybds(2).wVk = Target2 '按下第二键
    InputKeybds(2).dwFlags = 0 '按下键
    SendKeybdInput 2, InputKeybds(1), LenB(InputKeybds(1)) ' 2 表示InputKeybds是两组一起的,LenB返回用于表示此字符串的字节的数目,而不是返回字符串中的字符数len

    sleep 1000'增加睡眠1秒给电脑反应
    InputKeybds(1).dwFlags = 2 ' 抬起键,建议用2,用其他的也可以,但是莫名其妙的出错
    InputKeybds(2).dwFlags = 2 ' 抬起键
    SendKeybdInput 2, InputKeybds(1), LenB(InputKeybds(1)) '执行操作
End Sub
Sub Keybd(Target As Long)
    Dim InputKeybd As InputKeybd
    InputKeybd.InputType = 1 ' 表示键盘输入
    InputKeybd.wVk = Target '键位,用虚拟键码的值,一般用10进制值
    InputKeybd.dwFlags = 0 ' 按下键
    SendKeybdInput 1, InputKeybd, LenB(InputKeybd) '执行按下
    InputKeybd.dwFlags = 2 ' 抬起键
    SendKeybdInput 1, InputKeybd, LenB(InputKeybd) ' 执行抬起
End Sub

'-----------------------------------------------分割线-----------------------------

涉及到一些内容我也不知道,比如keybd的按下为什么要用0,抬起为什么要用2,我测试了一下这样做不会出错。有大佬知道到这块的话,可以告诉我,我想知道为什么。

我参考过的网站

https://www.csdn.net/p/398815977
SendInput模拟鼠标键盘_51CTO博客_c#模拟鼠标键盘操作

windows 如何在VBA中使用SendInput函数合并Chrome窗口的击键? _大数据知识库

最后一个链接的最后一个人的代码是我这个代码最主要的来源,非常感谢各位大佬的分享

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值