VB调用sendinput API
http://files.cnblogs.com/files/liuzhaoyzz/VB%E8%B0%83%E7%94%A8sendinput_API.rar
sendinput只支持发送字符或者组合键给前台程序,相当于keybd_event和vb的sendkeys。
好像他比keybd_event稍强,能够支持CTRL+C,ctrl+X,ctrl+V。
http://bbs.csdn.net/topics/90509805
hd378发表于: 2006-12-24 14:35:39
在网络上大神的指引下,我完善了两个函数, SendKeyCTRLplus和SendKeyALTplus。调用方法举例:
MySendKey vbKeyA
SendKeyCTRLplus vbKeyA
SendKeyALTplus vbKeyH, vbKeyA
'尝试用SendInput按住ALT,Postmessage发送H键到记事本失败:前台也不行,但是直接用SendInput成功:
'keybd_event在前台按住ALT,Postmessage发送H键到记事本成功,但是继续按A失败,他们是一对儿。
还能够直接发送中文字符到另一个进程,例如记事本。
'form1的代码:------------------------------------
Private Sub Command1_Click() '发送A到记事本
Dim dHwnd As Long
Dim tHwnd As Long
dHwnd = FindWindow("Notepad", vbNullString)
If dHwnd > 0 Then
tHwnd = FindWindowEx(dHwnd, ByVal 0&, "Edit", vbNullString)
End If
SetForegroundWindow dHwnd
MySendKey vbKeyA
'等价于以下语句:
' MySendKeyStep vbKeyA, 0 '按下
' Sleep 100
' MySendKeyStep vbKeyA, 1 '弹起
End Sub
Private Sub Command2_Click() '发送CTRL+A到记事本
Dim dHwnd As Long
Dim tHwnd As Long
dHwnd = FindWindow("Notepad", vbNullString)
If dHwnd > 0 Then
tHwnd = FindWindowEx(dHwnd, ByVal 0&, "Edit", vbNullString)
End If
SetForegroundWindow dHwnd
SendKeyCTRLplus vbKeyA
End Sub
Private Sub Command3_Click() '发送ALT+H,A到记事本
Dim dHwnd As Long
Dim tHwnd As Long
dHwnd = FindWindow("Notepad", vbNullString)
If dHwnd > 0 Then
tHwnd = FindWindowEx(dHwnd, ByVal 0&, "Edit", vbNullString)
End If
SetForegroundWindow dHwnd
SendKeyALTplus vbKeyH, vbKeyA '发送ALT+H,A到记事本成功
'尝试用SendInput按住ALT,Postmessage发送H键到记事本失败:前台也不行,但是直接用SendInput成功:
' MySendKeyStep vbKeyMenu, 0 '按下
' Sleep 100
' ' PostMessage dHwnd, WM_KEYDOWN, vbKeyH, MakeKeyLparam(vbKeyH, WM_KEYDOWN)'失败
' ' Sleep 200
' ' PostMessage dHwnd, WM_KEYUP, vbKeyH, MakeKeyLparam(vbKeyH, WM_KEYUP)'失败
' MySendKeyStep vbKeyH, 0 '按下
' Sleep 100
' MySendKeyStep vbKeyH, 1 '弹起
' Sleep 100
' MySendKeyStep vbKeyMenu, 1 '弹起
' Sleep 100
' MySendKeyStep vbKeyA, 0 '按下
' Sleep 100
' MySendKeyStep vbKeyA, 1 '弹起
End Sub
Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long '修订后的完整版本
Dim sx As String
Dim Firstbyte As String 'lparam参数的24-31位
Select Case flag
Case WM_KEYDOWN: Firstbyte = "00"
Case WM_KEYUP: Firstbyte = "C0"
Case WM_CHAR: Firstbyte = "20"
Case WM_SYSKEYDOWN: Firstbyte = "20"
Case WM_SYSKEYUP: Firstbyte = "E0"
Case WM_SYSCHAR: Firstbyte = "E0"
End Select
Dim Scancode As Long
'获得键的扫描码
Scancode = MapVirtualKey(VirtualKey, 0)
Dim Secondbyte As String 'lparam参数的16-23位,即虚拟键扫描码
Secondbyte = Right("00" & Hex(Scancode), 2)
sx = Firstbyte & Secondbyte & "0001" '0001为lparam参数的0-15位,即发送次数和其它扩展信息
MakeKeyLparam = Val("&H" & sx)
End Function
Private Sub Command4_Click() '发送F3到记事本
Dim dHwnd As Long
Dim tHwnd As Long
dHwnd = FindWindow("Notepad", vbNullString)
If dHwnd > 0 Then
tHwnd = FindWindowEx(dHwnd, ByVal 0&, "Edit", vbNullString)
End If
SetForegroundWindow dHwnd
MySendKey vbKeyF3
'等价于以下语句:
' MySendKeyStep vbKeyF3, 0 '按下
' Sleep 100
' MySendKeyStep vbKeyF3, 1 '弹起
End Sub
Private Sub Command5_Click() '发送CTRL+C到记事本
Dim dHwnd As Long
Dim tHwnd As Long
dHwnd = FindWindow("Notepad", vbNullString)
If dHwnd > 0 Then
tHwnd = FindWindowEx(dHwnd, ByVal 0&, "Edit", vbNullString)
End If
SetForegroundWindow dHwnd
SendKeyCTRLplus vbKeyC
End Sub
Private Sub Command6_Click() '发送CTRL+V到记事本
Dim dHwnd As Long
Dim tHwnd As Long
dHwnd = FindWindow("Notepad", vbNullString)
If dHwnd > 0 Then
tHwnd = FindWindowEx(dHwnd, ByVal 0&, "Edit", vbNullString)
End If
SetForegroundWindow dHwnd
SendKeyCTRLplus vbKeyV
End Sub
'模块1:------------------------------------------------------------------------------------------
Declare Function SendInput Lib "user32.dll" (ByVal nInputs As Long, pInputs As GENERALINPUT, ByVal cbSize As Long) As Long
'Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Type GENERALINPUT
dwType As Long
xi(0 To 23) As Byte
End Type
Type KEYBDINPUT
wVk As Integer
wScan As Integer
dwFlags As Long
time As Long
dwExtraInfo As Long
End Type
Const INPUT_KEYBOARD = 1
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Public Const KEYEVENTF_KEYUP = &H2
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'调用方法举例:
'MySendKey vbKeyA '向前台窗口发送字符A
Sub MySendKey(bkey As Long)
'参数bkey传入要模拟按键的虚拟码即可模拟按下指定键
Dim GInput(0 To 1) As GENERALINPUT
Dim KInput As KEYBDINPUT
KInput.wVk = bkey '你要模拟的按键
KInput.dwFlags = 0 '按下键标志
GInput(0).dwType = INPUT_KEYBOARD
CopyMemory GInput(0).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
KInput.wVk = bkey
KInput.dwFlags = KEYEVENTF_KEYUP ' 释放按键
GInput(1).dwType = INPUT_KEYBOARD ' 表示该消息为键盘消息
CopyMemory GInput(1).xi(0), KInput, Len(KInput)
'以上工作把按下键和释放键共2条键盘消息加入到GInput数据结构中
SendInput 2, GInput(0), Len(GInput(0)) '把上面的按键消息插入到windows消息队列
End Sub
'把一个按键消息分成两步,第一步按下,第二步弹起,调用方法举例1:
' MySendKeyStep vbKeyControl, 0'按下
' Sleep 100
' MySendKeyStep vbKeyA, 0'按下
' Sleep 100
' MySendKeyStep vbKeyA, 1'弹起
' Sleep 100
' MySendKeyStep vbKeyControl, 1'弹起
'举例2:
' MySendKeyStep vbKeyF3, 0 '按下
' Sleep 100
' MySendKeyStep vbKeyF3, 1 '弹起
Sub MySendKeyStep(bkey As Long, press)
'参数bkey传入要模拟按键的虚拟码即可模拟按下指定键
Dim GInput(0 To 1) As GENERALINPUT
Dim KInput As KEYBDINPUT
If press = 0 Then '如果按键按下
KInput.wVk = bkey '你要模拟的按键
KInput.dwFlags = 0 '按下键标志
GInput(0).dwType = INPUT_KEYBOARD
CopyMemory GInput(0).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
Call SendInput(1, GInput(0), Len(GInput(0))) '把上面的按键消息插入到windows消息队列
Else '如果按键弹起
KInput.wVk = bkey
KInput.dwFlags = KEYEVENTF_KEYUP ' 释放按键
GInput(0).dwType = INPUT_KEYBOARD ' 表示该消息为键盘消息
CopyMemory GInput(0).xi(0), KInput, Len(KInput)
Call SendInput(1, GInput(0), Len(GInput(0))) '把上面的按键消息插入到windows消息队列
End If
End Sub
'调用方法举例:
'SendKeyCTRLplus vbKeyA 'ctrl+a
Sub SendKeyCTRLplus(bkey As Long)
'参数bkey传入要模拟按键的虚拟码即可模拟按下指定键
Dim GInput(0 To 8) As GENERALINPUT
Dim KInput As KEYBDINPUT
'按下ctrl
KInput.wVk = vbKeyControl '你要模拟的按键
KInput.dwFlags = 0 '按下键标志
GInput(0).dwType = INPUT_KEYBOARD
CopyMemory GInput(0).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
Call SendInput(1, GInput(0), Len(GInput(0))) '把上面的按键消息插入到windows消息队列
Sleep 100
'按下bkey
KInput.wVk = bkey '你要模拟的按键
KInput.dwFlags = 0 '按下键标志
GInput(1).dwType = INPUT_KEYBOARD
CopyMemory GInput(1).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
Call SendInput(1, GInput(1), Len(GInput(1))) '把上面的按键消息插入到windows消息队列
Sleep 100
'弹起bkey
KInput.wVk = bkey
KInput.dwFlags = KEYEVENTF_KEYUP ' 释放按键
GInput(2).dwType = INPUT_KEYBOARD ' 表示该消息为键盘消息
CopyMemory GInput(2).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
Call SendInput(1, GInput(2), Len(GInput(2))) '把上面的按键消息插入到windows消息队列
Sleep 100
'弹起ctrl
KInput.wVk = vbKeyControl
KInput.dwFlags = KEYEVENTF_KEYUP ' 释放按键
GInput(3).dwType = INPUT_KEYBOARD ' 表示该消息为键盘消息
CopyMemory GInput(3).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
Call SendInput(1, GInput(3), Len(GInput(3))) '把上面的按键消息插入到windows消息队列
End Sub
'调用方法举例:
'SendKeyALTplus vbKeyH, vbKeyA 'ALT+H,A
Sub SendKeyALTplus(bkey As Long, bkey2 As Long)
'参数bkey传入要模拟按键的虚拟码即可模拟按下指定键
Dim GInput(0 To 8) As GENERALINPUT
Dim KInput As KEYBDINPUT
'按下alt
KInput.wVk = vbKeyMenu '你要模拟的按键
KInput.dwFlags = 0 '按下键标志
GInput(0).dwType = INPUT_KEYBOARD
CopyMemory GInput(0).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
Call SendInput(1, GInput(0), Len(GInput(0))) '把上面的按键消息插入到windows消息队列
Sleep 100
'按下bkey
KInput.wVk = bkey '你要模拟的按键
KInput.dwFlags = 0 '按下键标志
GInput(1).dwType = INPUT_KEYBOARD
CopyMemory GInput(1).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
Call SendInput(1, GInput(1), Len(GInput(1))) '把上面的按键消息插入到windows消息队列
Sleep 100
'弹起bkey
KInput.wVk = bkey
KInput.dwFlags = KEYEVENTF_KEYUP ' 释放按键
GInput(2).dwType = INPUT_KEYBOARD ' 表示该消息为键盘消息
CopyMemory GInput(2).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
Call SendInput(1, GInput(2), Len(GInput(2))) '把上面的按键消息插入到windows消息队列
Sleep 100
'弹起alt
KInput.wVk = vbKeyMenu
KInput.dwFlags = KEYEVENTF_KEYUP ' 释放按键
GInput(3).dwType = INPUT_KEYBOARD ' 表示该消息为键盘消息
CopyMemory GInput(3).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
Call SendInput(1, GInput(3), Len(GInput(3))) '把上面的按键消息插入到windows消息队列
Sleep 100
'按下bkey2
KInput.wVk = bkey2 '你要模拟的按键
KInput.dwFlags = 0 '按下键标志
GInput(4).dwType = INPUT_KEYBOARD
CopyMemory GInput(4).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
Call SendInput(1, GInput(4), Len(GInput(4))) '把上面的按键消息插入到windows消息队列
Sleep 100
'弹起bkey2
KInput.wVk = bkey2
KInput.dwFlags = KEYEVENTF_KEYUP ' 释放按键
GInput(5).dwType = INPUT_KEYBOARD ' 表示该消息为键盘消息
CopyMemory GInput(5).xi(0), KInput, Len(KInput) '这个函数用来把内存中KInput的数据复制到GInput
Call SendInput(1, GInput(5), Len(GInput(5))) '把上面的按键消息插入到windows消息队列
End Sub
VB调用sendinput API的更多相关文章
- VB 调用动态链接库
作为一种简单易用的Windows开发环境,Visual Basic从一推出就受到了广大编程人员的欢迎.它使 程序员不必再直接面对纷繁复杂的Windows消息,而可以将精力主要集中在程序功能的实现上,大 ...
- VBS调用Windows API函数
Demon's Blog 忘记了,喜欢一个人的感觉 Demon's Blog » 程序设计 » VBS调用Windows API函数 « 用VBS修改Windows用户密码 在VB中创建和使用 ...
- Unity在Android和iOS中如何调用Native API
本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调 ...
- C#调用windows API的一些方法
使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1. 直接调用从 DLL 导出的函数. 2. ...
- 使用Python调用Flickr API抓取图片数据
Flickr是雅虎旗下的图片分享网站,上面有全世界网友分享的大量精彩图片,被认为是专业的图片网站.其API也很友好,可以实现多种功能.这里我使用了Python调用其API获得了大量的照片数据.需要注意 ...
- WebApi系列~通过HttpClient来调用Web Api接口
回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...
- C#调用Windows API函数截图
界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...
- 以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API
新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种: 1.基于Oauth协议,使用Open API.(http://open.weibo.com/wiki/%E6%8E%88%E6 ...
- 【转】用C#调用Windows API向指定窗口发送
一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...
随机推荐
- Node.js Express 框架 POST方法
POST 方法 以下实例演示了在表单中通过 POST 方法提交两个参数,我们可以使用 server.js 文件内的 process_post 路由器来处理输入: index.htm 文件代码修改如下: ...
- matlab画柱状图
论文中需要画图进行比较,感觉还是matlab画起来比较方便,先把自己画的图及matlab代码放上. y=[300 311;390 425; 312 321; 250 185; 550 535; 420 ...
- mysql count(*)和count(列)速率
count(*)通常是对主键进行索引扫描,count(列)不一定 count(*)是统计表中所有符合的记录总数,count(列)是计算表中所有符合的列的记录数 count的时候,如果没有where限制 ...
- C语言回顾-结构体、枚举和文件
1.构造类型 根据已经定义的一个或多个数据类型用构造的方法来定义. 分为:数组.结构体和共用体 2.结构体 struct 结构体名{ 成员列表: }; 1)结构体定义完成以后,计算机不会给结构体分配存 ...
- Java未被捕获的异常该怎么处理
在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式.class Exc0 { public static void ...
- YbSoftwareFactory 代码生成插件【二十二】:CMS基础功能的实现
很多网友建议在YbRapidSolution for MVC框架的基础上实现CMS功能,以方便进行内容的管理,加快前端页面的开发速度.因此花了一段时间,实现了一套CMS内容发布系统并已集成至YbRap ...
- 108 vpn iptables
[root@fge108 webapps]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 47.88.1 ...
- 阿里巴巴矢量图标的使用Demo
一.html网页的使用步骤: 1. 登录进入阿里巴巴矢量图标库中,选择自己喜欢的图标,放到购物车,http://www.iconfont.cn/plus/manage/index?manage_typ ...
- python:字符串转换成字节的三种方式
str='zifuchuang' 第一种 b'zifuchuang'第二种bytes('zifuchuang',encoding='utf-8')第三种('zifuchuang').encode('u ...
- 【原创】在pc端集成地图功能(一)
在pc端做人员调度功能,用到地图.看了一点高德地图API,由于手机端用的是百度地图,现在需要改用百度地图.下面把看的高德地图一点点成果记录下来: 1.在高德地图开放平台(http://lbs.amap ...