vb或按键精灵颜色判断: 如何在不使用判断的情况下通过变量指定执行某个子程序(sub)或函数(functi

最最最最经典的教程,彻底讲解循环语句,新手不看会后悔!! _ 脚本制作教程 - 按键精灵论坛
腾讯微博:
软件版本:2014.05软件大小:76.8M更新时间:2-21
软件版本:3.2.5软件大小:62.5M更新时间:06-06
软件版本:1.2.7软件大小:29.2M更新时间:06-19
软件版本:1.1.0软件大小:12.3M更新时间:12-29
查看: 52512|回复: 2364
脚本作者商业小精灵作者绑定账号后自动赠送按键会员(季)按键会员绑定账号后自动赠送学有所成学有所成勋章,新手步入按键学堂的第一枚勋章按键精灵开发者6级可通过提升认证等级来升级勋章:黄金之翼黄金之翼勋章按键明星按键明星勋章
本帖最后由 lqfly 于
14:37 编辑 真的很经典至少是我见过的最经典的了,你看了之后对循环语句的疑问将彻底没有,将达到完全理解的程度,你见过这样的教程吗?其他教程能与之媲美吗?没有,应该没有,这才是真正的教程,从每一点每一滴开始讲起!***** 该内容需您才可浏览 *****
smartman11
按键精灵开发者2级可通过提升认证等级来升级勋章:
学习了....
接单q号: 。小单100 ;大单商议。
peiyanxiaog
饿...好好看看去!
zoukai36873
盒子会员盒子会员专属勋章按键会员(月)按键会员绑定账号后自动赠送
我学习学习下
按键会员(月)按键会员绑定账号后自动赠送
GEI WO KANK KAN
按键会员(月)按键会员绑定账号后自动赠送学有所成学有所成勋章,新手步入按键学堂的第一枚勋章按键会员(季)按键会员绑定账号后自动赠送脚本作者商业小精灵作者绑定账号后自动赠送
的最经典的
we似曾相识
管理人员按键论坛的管理团队专属勋章按键元老资深按键用户的尊贵荣誉勋章学有所成学有所成勋章,新手步入按键学堂的第一枚勋章论坛GG按键论坛男性用户勋章活动狂人论坛活动狂人按键明星按键明星勋章马年勋章(360天) 马年纪念勋章(360天)兔年勋章(360天)兔年纪念勋章(360天)十周年勋章(360天)十周年纪念勋章龙年勋章(360天)龙年纪念勋章(360天)骨灰级按键用户3年以上的按键论坛用户黄金之翼黄金之翼勋章天使勋章天使一样的用户黄瓜勋章(永久)体验商业小精灵活动的奖励
欣赏下内容
We're brothers that is why we are called vrbrothers
学习中,谢谢
学有所成学有所成勋章,新手步入按键学堂的第一枚勋章龙年勋章(360天)龙年纪念勋章(360天)按键精灵开发者2级可通过提升认证等级来升级勋章:
qqqqqqqqqqqqqqqqqqqqqqqqqq
学有所成学有所成勋章,新手步入按键学堂的第一枚勋章发帖高手鼓励积极回复,但注意不要灌水哦小红帽对论坛提出良好建议(可向管理员申请)按键会员(季)按键会员绑定账号后自动赠送按键精灵开发者3级可通过提升认证等级来升级勋章:
新手来学习。
kkkkkkkkkkk
kywkywkyw_2011
欣赏一下,看看能否得到心得
按键会员(月)按键会员绑定账号后自动赠送
有道理........
学有所成学有所成勋章,新手步入按键学堂的第一枚勋章教程达人教程达人十周年勋章(360天)十周年纪念勋章龙年勋章(360天)龙年纪念勋章(360天)按键精灵开发者4级可通过提升认证等级来升级勋章:
我要看看,不后悔
要看看,不后悔
努力学习中,谢谢lz
按键精灵开发者4级可通过提升认证等级来升级勋章:学有所成学有所成勋章,新手步入按键学堂的第一枚勋章按键14周年庆纪念勋章按键14周年庆纪念勋章(360天)
最最最最经典的教程,彻底讲解循环语句,新手不看会后悔!!
很是吸引啊。。看看如何把自己的按键精**序封装成一个函数? _ 综合讨论 - 按键精灵论坛
腾讯微博:
软件版本:2014.05软件大小:76.8M更新时间:2-21
软件版本:3.2.5软件大小:62.5M更新时间:06-06
软件版本:1.2.7软件大小:29.2M更新时间:06-19
软件版本:1.1.0软件大小:12.3M更新时间:12-29
查看: 1955|回复: 6
我现在是写个多个脚本,每一个是一个模块,根据需要把这些模块排列组合生成最终的脚本现在的办法只能是每一个脚本写成一段存在一个TXT里,然后再复制粘贴如果能把每一个模块包装成一个函数或者dll(是不是也叫函数?)然后几个地方做一个调用不就最方便了吗?我又不会写VB什么的按键精灵的脚本能自己封装吗?另外,有些地方需要中间加入一些内容或者匹配一些变量,如果做成函数的话,怎么能把这些中间的内容做成开口呢?麻烦各位大神了
playandhappy
学有所成学有所成勋章,新手步入按键学堂的第一枚勋章爱心大使积极帮助新手(可向管理员进行申请)兔年勋章(360天)兔年纪念勋章(360天)按键精灵开发者6级可通过提升认证等级来升级勋章:骨灰级按键用户3年以上的按键论坛用户黄金之翼黄金之翼勋章按键明星按键明星勋章潜水员按键潜水员勋章天使勋章天使一样的用户官方脚本作者工会官方脚本作者工会专属勋章 认证考霸(90天)参加考霸活动,对认证考了十次以上用户的鼓励幸运草勋章(永久)商业小精灵限时活动勋章。单身汪勋章单身贵族的专属勋章
那就是函数嘛,你自己也提到了。或者命令库,那玩意在我看来和函数一样。。
技能列表:各类自动化,TCP通信,POST,办公,Sqlserver,网页API要价较高,慎入只接单,其他问题勿扰
按键精灵开发者6级可通过提升认证等级来升级勋章:月全勤论坛自然月(如8.1-8.31)签到满勤,系统会在月底自动判断发放。
我是断涯,承接各类软件制作
playandhappy 发表于
23:04 那就是函数嘛,你自己也提到了。或者命令库,那玩意在我看来和函数一样。。怎么制作成一个函数呢?还有 怎么把写好的东西放进 我的命令库里边?
<font color="# 发表于
23:06 按键无模块这个概念按键做不了函数封装(dll)我查看了一些原来写的命令库然后有这么一个问题请教您我有些代码是汉堡包形状的就是框架是两片面包,每次需要加不同的肉进去但是加的东西不仅仅是一个函数而是好几行代码但是我看做成命令库的必须是一个SUB 也就是整个程序是封死的请问有办法让命令库在中间是开着的 这样我既可以调用命令库又可以在中甲加入自己要做的其他代码吗?谢谢您了&#xe621; 上传我的文档
&#xe602; 下载
&#xe60c; 收藏
该文档贡献者很忙,什么也没留下。
&#xe602; 下载此文档
正在努力加载中...
按键精灵四级选择题
下载积分:3000
内容提示:按键精灵四级选择题
文档格式:DOCX|
浏览次数:27|
上传日期: 00:33:16|
文档星级:&#xe60b;&#xe60b;&#xe60b;&#xe60b;&#xe60b;
全文阅读已结束,如果下载本文需要使用
&#xe71b; 3000 积分
&#xe602;下载此文档
该用户还上传了这些文档
按键精灵四级选择题
官方公共微信1609人阅读
原贴:[原创帖]VB模拟出的按键精灵大部分功能
/thread-.html
(出处: 吾爱破解论坛)
Private Declare Sub keybd_event Lib &user32& (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Declare Sub mouse_event Lib &user32& (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Declare Function GetCursorPos Lib &user32& (lpPoint As POINTAPI) As Long
Private Declare Sub Sleep Lib &kernel32& (ByVal dwMilliseconds As Long)
Private Declare Function GetPixel Lib &gdi32& (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetDC Lib &user32& (ByVal Hwnd As Long) 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
Private Declare Function GetPrivateProfileString Lib &kernel32& Alias &GetPrivateProfileStringA& (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName
As String)
Private Declare Function WritePrivateProfileString Lib &kernel32& Alias &WritePrivateProfileStringA& (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lplFileName As String) As Long
Private Declare Function WindowFromPoint& Lib &user32& (ByVal x As Long, ByVal y As Long)
Private Declare Function GetForegroundWindow Lib &user32& () As Long
Private Declare Function FindWindow Lib &user32& Alias &FindWindowA& (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private 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
Private Declare Function SendMessage Lib &user32& Alias &SendMessageA& (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare Function GetClassName Lib &user32& Alias &GetClassNameA& (ByVal Hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function CloseHandle Lib &kernel32& (ByVal hObject As Long) As Long
Private Declare Function CreateToolhelp32Snapshot Lib &kernel32& (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Module32First Lib &kernel32& (ByVal hSnapshot As Long, lppe As MODULEENTRY32) As Long
Private Declare Function Module32Next Lib &kernel32& (ByVal hSnapshot As Long, lppe As MODULEENTRY32) As Long
Private Declare Function Process32First Lib &kernel32& (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib &kernel32& (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function GetWindowThreadProcessId Lib &user32& (ByVal Hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function GetClientRect Lib &user32& (ByVal Hwnd As Long, lpRect As rect) As Long
Private Declare Function SetForegroundWindow Lib &user32& (ByVal Hwnd As Long) As Long
Private Declare Function ShowWindow Lib &user32& (ByVal Hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function SetWindowPos Lib &user32& (ByVal Hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function MoveWindow Lib &user32& (ByVal Hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
Private Declare Function SetForegroundWindow Lib &user32& (ByVal Hwnd As Long) As Long
Private Type rect
top As Long
left As Long
endtop As Long
endleft As Long
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * 1024
Private Type MODULEENTRY32
dwSize As Long
th32ModuleID As Long
th32ProcessID As Long
GlblcntUsage As Long
ProccntUsage As Long
modBaseAddr As Byte
modBaseSize & As Long
hModule As Long
szModule As String * 256
szExePath As String * 1024
Private Const TH32CS_SNAPPROCESS = &H2
Private Const TH32CS_SNAPMODULE = &H8
Private Type POINTAPI
功能实现部分:
Public Function KeyDown(jm) '按下某键
keybd_event jm, 0, 0, 0
End Function
Public Function KeyUp(jm) '弹起某键
keybd_event jm, 0, &H2, 0
End Function
Public Function KeyPress(jm, cs) &'按某键
For c = 1 To cs
keybd_event jm, 0, &H1, 0
End Function
Public Function MouseMove(x, y) & & & &'移动鼠标
mouse_event &H8000 Or &H1, 0, 0, 0, 0
mouse_event &H1, x, y, 0, 0
End Function
Public Function MousePressL(cs) & & & &'按鼠标左键
For c = 1 To cs
mouse_event &H2 Or &H4, 0, 0, 0, 0
End Function
Public Function MouseDownL() & '按下鼠标左键
mouse_event &H2, 0, 0, 0, 0
End Function
Public Function MouseUpL() & &'弹起鼠标左键
mouse_event &H4, 0, 0, 0, 0
End Function
Public Function MousePressR(cs) & & & & &'按鼠标右键
For c = 1 To cs
mouse_event &H8 Or &H10, 0, 0, 0, 0
End Function
Public Function MouseDownR() & '按下鼠标右键
mouse_event &H8, 0, 0, 0, 0
End Function
Public Function MouseUpR() &'弹起鼠标右键
mouse_event &H10, 0, 0, 0, 0
End Function
Public Function MousePressM(cs) & & & &'按鼠标中键
For c = 1 To cs
mouse_event &H20 Or &H40, 0, 0, 0, 0
End Function
Public Function MouseDownM() & '按下鼠标中键
mouse_event &H20, 0, 0, 0, 0
End Function
Public Function MouseUpM() &'弹起鼠标中键
mouse_event &H40, 0, 0, 0, 0
End Function
Public Function MouseXY() '返回现在鼠标位置
Dim p As POINTAPI
GetCursorPos p
MouseXY = p.x & &/& & p.y
End Function
Public Function Delay(sj) '等待一定时间
End Function
Public Function DLGetPixel(x, y) '返回指定坐标的16进制颜色
DLGetPixel = GetPixel(GetDC(0), x, y)
DLGetPixel = Hex(DLGetPixel)
End Function
Public Function HMouseClickL(Hwnd, x, y) '后台发送鼠标左键命令
Dim lParam As Long
lParam = (y * &H10000) &#43; x
PostMessage Hwnd, &H201, 0&, ByVal lParam
& PostMessage Hwnd, &H202, 0&, ByVal lParam
End Function
Public Function HMouseClickR(Hwnd, x, y) '后台发送鼠标右键命令
Dim lParam As Long
lParam = (y * &H10000) &#43; x
PostMessage Hwnd, &H204, 0&, ByVal lParam
& PostMessage Hwnd, &H205, 0&, ByVal lParam
End Function
Public Function HMouseClickM(Hwnd, x, y) '后台发送鼠标中命令
Dim lParam As Long
lParam = (y * &H10000) &#43; x
PostMessage Hwnd, &H207, 0&, ByVal lParam
& PostMessage Hwnd, &H208, 0&, ByVal lParam
End Function
Public Function HKeyPress(Hwnd, jm) '后台发送键盘命令
PostMessage Hwnd, &H101, jm, 0
End Function
Public Function DLDir(path) & &'判断文件或文件夹是否存在
If Dir(path) = && Then
End Function
Public Function INIRead(xj As String, zhi As String, lj As String) '读INI
Dim zs As String * 255
INIRead = left(zs, GetPrivateProfileString(xj, zhi, &&, zs, Len(zs), lj))
End Function
Public Function INIWhile(xj As String, zhi As String, nr As String, lj As String) As String '写INI
INIWhile = WritePrivateProfileString(xj, zhi, nr, lj)
End Function
Public Function DLMouseHwnd() '返回鼠标现在指向的窗口句柄
Dim lRet As Long
Dim ptAPI As POINTAPI
GetCursorPos ptAPI
lRet = WindowFromPoint(ptAPI.x, ptAPI.y)
DLMouseHwnd = lRet
End Function
Public Function DLQTHwnd() '返回现在激活窗口的句柄
DLQTHwnd = GetForegroundWindow
End Function
Public Function FindWin(lei, name) As Long &'返回指定窗口标题或类名的窗口句柄
If lei = 0 Then
lei = vbNullString
FindWin = FindWindow(lei, name)
End Function
Public Function FindWinEx(hWnd1, hWnd2, lei, name) As Long & '查找一个父窗口的子窗口句柄
If lei = 0 Then
lei = vbNullString
If name = 0 Then
name = vbNullString
FindWinEx = FindWindowEx(hWnd1, hWnd2, lei, name)
End Function
Public Function DLPdWin(name) As Long & '判断窗口是否存在
DLPdWin = FindWindow(vbNullString, name)
If DLPdWin = 0 Then
DLPdWin = &no&
DLPdWin = &yes&
End Function
Public Function GetText(ByVal Hwnd As Long) As String & & '得到指定句柄的标题
longs = SendMessage(Hwnd, &HE, 0, 0)
Dim Data As String
Data = String(longs, 0)
SendMessage Hwnd, &HD, longs &#43; 1, ByVal Data
GetText = Data
End Function
Public Function GetCName(Hwnd) As String '得到指定句柄的类名
Dim sf As String * 254
Dim zf As String
zf = GetClassName(Hwnd, sf, 255)
GetCName = Trim$(sf)
End Function
Public Function GetPath(Hwnd As Long) As String & '返回指定句柄的路径
hWindow = Hwnd
GetWindowThreadProcessId ByVal hWindow, pidWindow
Dim process As PROCESSENTRY32
Dim module As MODULEENTRY32
Dim hpSnapshot As Long
Dim hmSnapshot As Long
hpSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If hpSnapshot & 0 Then
process.dwSize = Len(process)
If Process32First(hpSnapshot, process) Then
If process.th32ProcessID = pidWindow Then
hmSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, process.th32ProcessID)
If hmSnapshot & 0 Then
module.dwSize = Len(module)
If Module32First(hmSnapshot, module) Then
GetPath = left(module.szExePath, InStr(module.szExePath, Chr(0)) - 1)
CloseHandle (hmSnapshot)
Loop Until (Process32Next(hpSnapshot, process) & 1)
CloseHandle (hpSnapshot)
End Function
Public Function GetDX(Hwnd) '返回指定窗口客服区大小
Dim dx As rect
x = GetClientRect(Hwnd, dx)
GetDX = dx.top & &\& & dx.left & &\& & dx.endtop & &\& & dx.endleft
End Function
Public Function DLActiveWindows(Hwnd As Long) & '激活后台窗口(不能激活最小化的窗口)
SetForegroundWindow Hwnd
End Function
Public Function DLWindowMax(Hwnd As Long) &'把已经最小化的窗口最大话并激活
ShowWindow Hwnd, 3
End Function
Public Function DLWindowMIX(Hwnd As Long) &'最小化一个窗口
ShowWindow Hwnd, 6
End Function
Public Function DLHideWindow(Hwnd As Long) & &'隐藏一个窗口
SetWindowPos Hwnd, 0, 0, 0, 0, 0, &H80
End Function
Public Function DLShowWindow(Hwnd As Long) & & '显示一个隐藏的窗口
SetWindowPos Hwnd, 0, 0, 0, 0, 0, &H40
End Function
Public Function DLMoveWindow(Hwnd As Long, x As Long, y As Long) &'保持大小移动一个窗口到指定坐标
SetWindowPos Hwnd, 0, x, y, 0, 0, &H1
End Function
Public Function DLCloseWindow(Hwnd As Long) &'关闭指定窗口
SendMessage Hwnd, &H10, 0, 0
End Function
Public Function DLMoveWindowH(Hwnd As Long, x As Long, y As Long, MaxX As Long, MaxY As Long) & '移动一个窗口 可以改变大小
MoveWindow Hwnd, x, y, MaxX, MaxY, 1
End Function
Public Function DLSetWindowActive(Hwnd As Long) '置一个窗口为前台窗口 但不弹出
SetForegroundWindow Hwnd
End Function&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8478次
排名:千里之外
原创:19篇
(1)(1)(4)(1)(1)(1)(1)(1)(1)(2)(6)VB制作按键精灵那种后台按键工具
我的图书馆
VB制作按键精灵那种后台按键工具
在VB中,有多种方法可以实现键盘模拟,我们就介绍几种比较典型的。 1.局部级模拟 从上面的流程可以看出,键盘事件是最终被送到,然后才引起目标程序响应的。那么最直接的模拟方法就是:直接伪造一个键盘消息发给目标程序。哈哈, 这实在是很简单,windows提供了几个这样的API函数可以实现直接向目标程序发送消息的功能,常用的有SendMessage和 PostMessage,它们的区别是PostMessage函数直接把消息仍给目标程序就不管了,而SendMessage把消息发出去后,还要等待目 标程序返回些什么东西才好。这里要注意的是,模拟键盘消息一定要用PostMessage函数才好,用SendMessage是不正确的(因为模拟键盘消 息是不需要返回值的,不然目标程序会没反应),切记切记!PostMessage函数的VB声明如下:Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long参数hwnd 是你要发送消息的目标程序上某个控件的,参数wMsg 是消息的类型,表示你要发送什么样的消息,最后wParam 和lParam 这两个参数是随消息附加的数据,具体内容要由消息决定。再来看看wMsg 这个参数,要模拟按键就靠这个了。键盘消息常用的有如下几个:WM_KEYDOWN 表示一个普通键被按下WM_KEYUP 表示一个普通键被释放WM_SYSKEYDOWN 表示一个系统键被按下,比如Alt键WM_SYSKEYUP 表示一个系统键被释放,比如Alt键如 果你确定要发送以上几个键盘消息,那么再来看看如何确定键盘消息中的wParam 和lParam 这两个参数。在一个键盘消息中,wParam 参数的 含义较简单,它表示你要发送的键盘事件的按键虚拟码,比如你要对目标程序模拟按下A键,那么wParam 参数的值就设为VK_A ,至于lParam 这个参数就比较复杂了,因为它包含了多个信息,一般可以把它设为0,但是如果你想要你的模拟更真实一些,那么建议你还是设置一下这个参数。那么我们就详细 了解一下lParam 吧。lParam 是一个long类型的参数,它在内存中占4个字节,写成就是 00
一共是32位,我们从右向左数,假设最右边那位为第0位(注意是从0而不是 从1开始计数),最左边的就是第31位,那么该参数的的0-15位表示键的发送次数等扩展信息,16-23位为按键的扫描码,24-31位表示是按下键还 是释放键。大家一般习惯写成16进制的,那么就应该是&H00 00 00 00 ,第0-15位一般为&H0001,如果是按下键,那 么24-31位为&H00,释放键则为&HC0,那么16-23位的扫描码怎么会得呢?这需要用到一个API函数 MapVirtualKey,这个函数可以将虚拟码转换为扫描码,或将扫描码转换为虚拟码,还可以把虚拟码转换为对应字符的ASCII码。它的VB声明如 下:Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long参 数wCode 表示待转换的码,参数wMapType 表示从什么转换为什么,如果是虚拟码转扫描码,则wMapType 设置为0,如果是虚拟扫描码转 虚拟码,则wMapType 设置为1,如果是虚拟码转ASCII码,则wMapType 设置为2.相信有了这些,我们就可以构造键盘事件的 lParam参数了。下面给出一个构造lParam参数的函数:Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As LongFunction MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long'参数VirtualKey表示按键虚拟码,flag表示是按下键还是释放键,用WM_KEYDOWN和WM_KEYUP这两个常数表示 Dim s As String Dim Firstbyte As String 'lparam参数的24-31位 If flag = WM_KEYDOWN Then '如果是按下键 Firstbyte = "00" Else Firstbyte = "C0" '如果是释放键 End If Dim Scancode As Long '获得键的扫描码 Scancode = MapVirtualKey(VirtualKey, 0) Dim Secondbyte As String 'lparam参数的16-23位,即虚拟键扫描码 Secondbyte = Right("00" & Hex(Scancode), 2) s = Firstbyte & Secondbyte & "0001" '0001为lparam参数的0-15位,即发送次数和其它扩展信息 MakeKeyLparam = Val("&H" & s)End Function这 个函数像这样调用,比如按下A键,那么lParam=MakeKeyLparam(VK_A,WM_KEYDOWN) ,很简单吧。值得注意的是,即使你 发送消息时设置了lParam参数的值,但是系统在传递消息时仍然可能会根据当时的情况重新设置该参数,那么目标程序收到的消息中lParam的值可能会 和你发送时的有所不同。所以,如果你很懒的话,还是直接把它设为0吧,对大多数程序不会有影响的,呵呵。 好了,做完以上的事情,现在我们可以向目标程序发送键盘消息了。首先取得目标程序接受这个消息的控件的句柄,比如目标句柄是12345,那么我们来对目标模拟按下并释放A键,像这样:(为了简单起见,lParam这个参数就不构造了,直接传0)PostMessage 12345,WM_KEYDOWN,VK_A,0& '按下A键PostMessage 12345,WM_UP,VK_A,0& '释放A键好 了,一次按键就完成了。现在你可以迫不及待的打开记事本做实验,先用FindWindowEx这类API函数找到记事本程序的句柄,再向它发送键盘消息, 期望记事本里能诡异的自动出现字符。可是你马上就是失望了,咦,怎么一点反应也没有?你欺骗感情啊~~~~~~~~~~55 不是的哦,接着往下看啊。一般目标程序都会含有多个控件,并不是每个控件都会对键盘消息作出反应,只有把键盘消息发送给接受它的控件才会得到期望 的反应。那记事本来说,它的编辑框其实是个edit类,只有这个控件才对键盘事件有反应,如果只是把消息发给记事本的窗体,那是没有用的。现在你找出记事 本那个编辑框的句柄,比如是54321,那么写如下代码:PostMessage 54321,WM_KEYDOWN,VK_F1,0& '按下F1键PostMessage 54321,WM_UP,VK_F1,0& '释放F1键怎么样,是不是打开了记事本的“帮助”信息?这说明目标程序已经收到了你发的消息,还不错吧~~~~~~~~可以马上新问题就来了,你想模拟向记事本按下A这个键,好在记事本里自动输入字符,可是,没有任何反应!这是怎么一回事呢?原 来,如果要向目标程序发送字符,光靠WM_KEYDOWN和WM_UP这两个事件还不行,还需要一个事件:WM_CHAR,这个消息表示一个字符,程序需 靠它看来接受输入的字符。一般只有A,B,C等这样的按键才有WM_CHAR消息,别的键(比如方向键和功能键)是没有这个消息的,WM_CHAR消息一 般发生在WM_KEYDOWN消息之后。WM_CHAR消息的lParam参数的含义与其它键盘消息一样,而它的wParam则表示相应字符的ASCII 编码(可以输入中文的哦^_^),现在你可以写出一个完整的向记事本里自动写入字符的程序了,下面是一个例子,并附有这些消息常数的具体值:Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongDeclare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As LongPublic Const WM_KEYDOWN = &H100Public Const WM_KEYUP = &H101Public Const WM_CHAR = &H102Public Const VK_A = &H41 Function MakeKeyLparam(ByVal VirtualKey As Long, ByVal flag As Long) As Long Dim s As String Dim Firstbyte As String 'lparam参数的24-31位 If flag = WM_KEYDOWN Then '如果是按下键 Firstbyte = "00" Else Firstbyte = "C0" '如果是释放键 End If Dim Scancode As Long '获得键的扫描码 Scancode = MapVirtualKey(VirtualKey, 0) Dim Secondbyte As String 'lparam参数的16-23位,即虚拟键扫描码 Secondbyte = Right("00" & Hex(Scancode), 2) s = Firstbyte & Secondbyte & "0001" '0001为lparam参数的0-15位,即发送次数和其它扩展信息 MakeKeyLparam = Val("&H" & s)End FunctionPrivate Sub Form_Load() dim hwnd as long hwnd = XXXXXX 'XXXXX表示记事本编辑框的句柄 PostMessage hwnd,WM_KEYDOWN,VK_A,MakeKeyLparam(VK_A,WM_KEYDOWN) '按下A键 PostMessage hwnd,WM_CHAR,ASC("A"),MakeKeyLparam(VK_A,WM_KEYDOWN) '输入字符A PostMessage hwnd,WM_UP,VK_A,MakeKeyLparam(VK_A,WM_UP) '释放A键End Sub这就是通过局部键盘消息来模拟按键。这个方法有一个极大的好处,就是:它可以实现后台按键,也就是说他对你的前台操作不会有什么影响。
其他回答(1)
3.驱动级模拟 如果上面的方法你都试过了,可是你发现目标程序却仍然顽固的不接受你模拟的消息,寒~~~~~~~~~还好,我还剩下最后一招,这就是驱动级模拟:直接读写键盘的硬件端口! 有一些使用DirectX接口的游戏程序,它们在读取键盘操作时绕过了windows的消息机制,而使用DirectInput.这是因为有些游戏对实时 性控制的要求比较高,比如赛车游戏,要求以最快速度响应键盘输入。而windows消息由于是队列形式的,消息在传递时会有不少延迟,有时1秒钟也就传递 十几条消息,这个速度达不到游戏的要求。而DirectInput则绕过了windows消息,直接与键盘驱动程序打交道,效率当然提高了不少。因此也就 造成,对这样的程序无论用PostMessage或者是keybd_event都不会有反应,因为这些函数都在较高层。对于这样的程序,只好用直接读写键 盘端口的方法来模拟硬件事件了。要用这个方法来模拟键盘,需要先了解一下键盘编程的相关知识。 在DOS时代,当用户按下或者放开一个键 时,就会产生一个键盘中断(如果键盘中断是允许的),这样程序会跳转到BIOS中的键盘中断处理程序去执行。打开windows的设备管理器,可以查看到 键盘控制器由两个端口控制。其中&H60是数据端口,可以读出键盘数据,而&H64是控制端口,用来发出控制信号。也就是,从& H60号端口可以读此键盘的按键信息,当从这个端口读取一个字节,该字节的低7位就是按键的扫描码,而高1位则表示是按下键还是释放键。当按下键时,最高 位为0,称为通码,当释放键时,最高位为1,称为断码。既然从这个端口读数据可以获得按键信息,那么向这个端口写入数据就可以模拟按键了!用过 QbASIC4.5的朋友可能知道,QB中有个OUT命令可以向指定端口写入数据,而INP函数可以读取指定端口的数据。那我们先看看如果用QB该怎么写 代码:假如你想模拟按下一个键,这个键的扫描码为&H50,那就这样OUT &H64,&HD2 '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据OUT &H60,&H50 '把扫描码&H50发送到&H60端口,表示模拟按下扫描码为&H50的这个键那么要释放这个键呢?像这样,发送该键的断码:OUT &H64,&HD2 '把数据&HD2发送到&H64端口。这是一个KBC指令,表示将要向键盘写入数据OUT &H60,(&H50 OR &H80) '把扫描码&H50与数据&H80进行或运算,可以把它的高位置1,得到断码,表示释放这个键好了,现在的问题就是在VB中如何向端口写入数据了。因为在windows中,普通应用程序是无权操作端口的,于是我们就需要一个驱动程序来帮助我们实 现。在这里我们可以使用一个组件WINIO来完成读写端口操作。什么是WINIO?WINIO是一个全免费的、无需注册的、含源程序的 WINDOWS2000端口操作驱动程序组件(可以到 上 去下载)。它不仅可以操作端口,还可以操作内存;不仅能在VB下用,还可以在DELPHI、VC等其它环境下使用,性能特别优异。下载该组件,解压缩后可 以看到几个文件夹,其中Release文件夹下的3个文件就是我们需要的,这3个文件是WinIo.sys(用于win xp下的驱动程序), WINIO.VXD(用于win 98下的驱动程序),WinIo.dll(封装函数的动态链接库),我们只需要调用WinIo.dll中的函数,然后 WinIo.dll就会安装并调用驱动程序来完成相应的功能。值得一提的是这个组件完全是绿色的,无需安装,你只需要把这3个文件复制到与你的程序相同的 文件夹下就可以使用了。用法很简单,先用里面的InitializeWinIo函数安装驱动程序,然后就可以用GetPortVal来读取端口或者用 SetPortVal来写入端口了。好,让我们来做一个驱动级的键盘模拟吧。先把winio的3个文件拷贝到你的程序的文件夹下,然后在VB中新建一个工 程,添加一个模块,在模块中加入下面的winio函数声明:Declare Function MapPhysToLin Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysSize As Long, ByRef PhysMemHandle) As LongDeclare Function UnmapPhysicalMemory Lib "WinIo.dll" (ByVal PhysMemHandle, ByVal LinAddr) As BooleanDeclare Function GetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByRef PhysVal As Long) As BooleanDeclare Function SetPhysLong Lib "WinIo.dll" (ByVal PhysAddr As Long, ByVal PhysVal As Long) As BooleanDeclare Function GetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByRef PortVal As Long, ByVal bSize As Byte) As BooleanDeclare Function SetPortVal Lib "WinIo.dll" (ByVal PortAddr As Integer, ByVal PortVal As Long, ByVal bSize As Byte) As BooleanDeclare Function InitializeWinIo Lib "WinIo.dll" () As BooleanDeclare Function ShutdownWinIo Lib "WinIo.dll" () As BooleanDeclare Function InstallWinIoDriver Lib "WinIo.dll" (ByVal DriverPath As String, ByVal Mode As Integer) As BooleanDeclare Function RemoveWinIoDriver Lib "WinIo.dll" () As Boolean' ------------------------------------以上是WINIO函数声明-------------------------------------------Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long'-----------------------------------以上是WIN32 API函数声明-----------------------------------------再添加下面这个过程:Sub KBCWait4IBE() '等待键盘缓冲区为空Dim dwVal As Long Do GetPortVal &H64, dwVal, 1'这句表示从&H64端口读取一个字节并把读出的数据放到变量dwVal中'GetPortVal函数的用法是GetPortVal 端口号,存放读出数据的变量,读入的长度 Loop While (dwVal And &H2)End Sub上面的是一个根据KBC规范写的过程,它的作用是在向键盘端口写入数据前等待一段时间,后面将会用到。然后再添加如下过程,这2个过程用来模拟按键:Public Const KBC_KEY_CMD = &H64 '键盘命令端口Public Const KBC_KEY_DATA = &H60 '键盘数据端口Sub MyKeyDown(ByVal vKeyCoad As Long) '这个用来模拟按下键,参数vKeyCoad传入按键的虚拟码Dim btScancode As LongbtScancode = MapVirtualKey(vKeyCoad, 0)
KBCWait4IBE '发送数据前应该先等待键盘缓冲区为空 SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令'SetPortVal函数用于向端口写入数据,它的用法是SetPortVal 端口号,欲写入的数据,写入数据的长度 KBCWait4IBE SetPortVal KBC_KEY_DATA, btScancode, 1 '写入按键信息,按下键 End SubSub MyKeyUp(ByVal vKeyCoad As Long) '这个用来模拟释放键,参数vKeyCoad传入按键的虚拟码Dim btScancode As LongbtScancode = MapVirtualKey(vKeyCoad, 0)
KBCWait4IBE '等待键盘缓冲区为空 SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令 KBCWait4IBE SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '写入按键信息,释放键End Sub定义了上面的过程后,就可以用它来模拟键盘输入了。在窗体模块中添加一个定时器控件,然后加入以下代码:Private Sub Form_Load() If InitializeWinIo = False Then
'用InitializeWinIo函数加载驱动程序,如果成功会返回true,否则返回false MsgBox "驱动程序加载失败!" Unload MeEnd IfTimer1.Interval=3000Timer1.Enabled=TrueEnd SubPrivate Sub Form_Unload(Cancel As Integer)ShutdownWinIo '程序结束时记得用ShutdownWinIo函数卸载驱动程序End SubPrivate Sub Timer1_Timer()Dim VK_A as Long = &H41 MyKeyDown VK_A MyKeyUp VK_A '模拟按下并释放A键End Sub运行上面的程序,就会每隔3秒钟模拟按下一次A键,试试看,怎么样,是不是对所有程序都有效果了?需要注意的问题:要在VB的调试模式下使用WINIO,需要把那3个文件拷贝到VB的安装目录中。键盘上有些键属于扩展键(比如键盘上的方向键就是扩展键),对于扩展键不应该用上面的MyKeyDown和MyKeyUp过程来模拟,可以使用下面的2个过程来准确模拟扩展键:Sub MyKeyDownEx(ByVal vKeyCoad As Long) '模拟扩展键按下,参数vKeyCoad是扩展键的虚拟码Dim btScancode As LongbtScancode = MapVirtualKey(vKeyCoad, 0) KBCWait4IBE '等待键盘缓冲区为空 SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令 KBCWait4IBE SetPortVal KBC_KEY_DATA, &HE0, 1 '写入扩展键标志信息
KBCWait4IBE '等待键盘缓冲区为空 SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令 KBCWait4IBE SetPortVal KBC_KEY_DATA, btScancode, 1 '写入按键信息,按下键
End SubSub MyKeyUpEx(ByVal vKeyCoad As Long) '模拟扩展键弹起Dim btScancode As LongbtScancode = MapVirtualKey(vKeyCoad, 0) KBCWait4IBE '等待键盘缓冲区为空 SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令 KBCWait4IBE SetPortVal KBC_KEY_DATA, &HE0, 1 '写入扩展键标志信息
KBCWait4IBE '等待键盘缓冲区为空 SetPortVal KBC_KEY_CMD, &HD2, 1 '发送键盘写入命令 KBCWait4IBE SetPortVal KBC_KEY_DATA, (btScancode Or &H80), 1 '写入按键信息,释放键 End Sub还 应该注意的是,如果要从扩展键转换到普通键,那么普通键的KeyDown事件应该发送两次。也就是说,如果我想模拟先按下一个扩展键,再按下一个普通键, 那么就应该向端口发送两次该普通键被按下的信息。比如,我想模拟先按下左方向键,再按下空格键这个事件,由于左方向键是扩展键,空格键是普通键,那么流程 就应该是这样的:MyKeyDownEx VK_LEFT '按下左方向键Sleep 200 '延时200毫秒MyKeyUpEx VK_LEFT '释放左方向键Sleep 500MyKeyDown VK_SPACE '按下空格键,注意要发送两次MyKeyDown VK_SPACESleep 200MyKeyUp VK_SPACE '释放空格键
馆藏&23104
TA的最新馆藏
喜欢该文的人也喜欢

我要回帖

更多关于 按键精灵2014 vb6.0 的文章

 

随机推荐