首页
社区
课程
招聘
[旧帖] [求助]麻烦高手指点一下这个vb软件是如何进行屏幕识别的?多谢了! 0.00雪花
发表于: 2008-6-3 22:04 6774

[旧帖] [求助]麻烦高手指点一下这个vb软件是如何进行屏幕识别的?多谢了! 0.00雪花

2008-6-3 22:04
6774
麻烦高手指点一下这个vb软件是如何进行屏幕识别的?多谢了!

这是一个困扰我好久的一个问题,有关如何使用vb编程实现读取屏幕指定位置的数字和文字,请教了好多高手,都认为采用vb来实现困难了一些,最好采用vc或者使用专门的屏幕识别软件,但是那样就太复杂了,而且也不显示。刚好有个朋友有个类似软件使用vb编写的,能够读取屏幕指定区域的数字和文字,可是我不知是程序是如何进行的。麻烦高手指点一下,最好能够标注一下,多谢了!

Type=Exe
Form=FORM01.FRM
Form=FORM02.FRM
Object={5E9E78A0-531B-11CF-91F6-C2863C385E30}#1.0#0; MSFLXGRD.OCX
Startup="Form1"
Title="工程1"
ExeName32="HB抄牌器带分牌检测.exe"
Command32=""
Name="工程1"
HelpContextID="0"
CompatibleMode="0"

AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0  区域检查
OverflowCheck=0  溢出检查
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1

VERSION 5.00
Object = "{5E9E78A0-531B-11CF-91F6-C2863C385E30}#1.0#0"; "MSFLXGRD.OCX"
Begin VB.Form Form1
   Caption         =   "互博抄牌器"
   ClientHeight    =   4455
   ClientLeft      =   12225
   ClientTop       =   4755
   ClientWidth     =   2880
   Icon            =   "FORM01.FRX":0000
   LinkTopic       =   "Form1"
   ScaleHeight     =   4455     标度高度
   ScaleWidth      =   2880    宽度
   Begin VB.ComboBox Combo1  组合1
      Height          =   300
      ItemData        =   "FORM01.FRX":08E6
      Left            =   240
      List            =   "FORM01.FRX":08CA
      TabIndex        =   15
      Text            =   "选择游戏"
      Top             =   3720
      Width           =   1335
   End
   Begin VB.CheckBox Check1  复选框
      Caption         =   "手工对码"
      Height          =   180
      Left            =   4560
      TabIndex        =   14
      Top             =   4440
      Width           =   1095
   End
   Begin MSFlexGridLib.MSFlexGrid MSFlexGrid2
      Height          =   1455
      Left            =   0
      TabIndex        =   13
      Top             =   2160
      Width           =   2895
   End
   Begin VB.TextBox INB3
      Height          =   375
      Left            =   5400
      TabIndex        =   12
      Top             =   4800
      Width           =   375
   End
   Begin VB.TextBox INB2
      Height          =   375
      Left            =   5040
      TabIndex        =   11
      Top             =   4800
      Width           =   375
   End
   Begin VB.TextBox INB1
      Height          =   375
      Left            =   4680
      TabIndex        =   10
      Top             =   4800
      Width           =   375
   End
   Begin VB.TextBox INP1
      Height          =   375
      Left            =   4080
      TabIndex        =   9
      Top             =   4800
      Width           =   375
   End
   Begin VB.TextBox INP2
      Height          =   375
      Left            =   3720
      TabIndex        =   8
      Top             =   4800
      Width           =   375
   End
   Begin VB.TextBox INP3
      Height          =   375
      Left            =   3360
      TabIndex        =   7
      Top             =   4800
      Width           =   375
   End
   Begin VB.TextBox Bdetail
      Height          =   1335
      Left            =   3000
      MultiLine       =  -1
      TabIndex        =   6
      Text            =   "FORM01.FRX":08F0
      Top             =   3000
      Width           =   2895
   End
   Begin VB.TextBox Pdetail
      Height          =   1455
      Left            =   3000
      MultiLine       =  -1
      TabIndex        =   5
      Text            =   "FORM01.FRX":090B
      Top             =   1440
      Width           =   2895
   End
   Begin VB.TextBox Text1
      BackColor       =   &H00FFC0C0&
      BorderStyle     =   0
      Height          =   735
      Left            =   3000
      MultiLine       =  -1
      TabIndex        =   4
      Top             =   600
      Width           =   2895
   End
   Begin VB.Timer Seemorethan3
      Enabled         =   0
      Interval        =   800
      Left            =   4560
      Top             =   120
   End
   Begin VB.Timer Softstate
      Enabled         =   0
      Interval        =   1000
      Left            =   3960
      Top             =   120
   End
   Begin VB.PictureBox Picture1
      BorderStyle     =   0
      Height          =   375
      Left            =   0
      ScaleHeight     =   375
      ScaleWidth      =   135
      TabIndex        =   2
      Top             =   3600
      Width           =   135
   End
   Begin MSFlexGridLib.MSFlexGrid MSFlexGrid1
      Height          =   2175
      Left            =   0
      TabIndex        =   1
      Top             =   0
      Width           =   2895
   End
   Begin VB.Timer Getstate
      Enabled         =   0
      Interval        =   500
      Left            =   3360
      Top             =   120
   End
   Begin VB.CommandButton Command1
      Caption         =   "运行"
      Height          =   375
      Left            =   1920
      TabIndex        =   0
      Top             =   3720
      Width           =   855
   End
   Begin VB.Label Statewordlist   状态字表
      Caption         =   "程序状态"
      Height          =   255
      Left            =   120
      TabIndex        =   3
      Top             =   4080
      Width           =   1815
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False

' This form rebuilt by VBRezQ v2.4a.  17-May-2008 / 06:57:23
Option Explicit

' Declare Function PathFileExistsA Lib "shlwapi.dll" ()

' Declare Function GetPixel Lib "gdi32" ()

' Declare Function GetDC Lib "USER32" ()

' Declare Function GetWindowDC Lib "USER32" ()

' Declare Function ReleaseDC Lib "USER32" ()

' Declare Function GetWindowRect Lib "USER32" ()

' Declare Function FindWindowA Lib "USER32" ()

' Declare Function mouse_event Lib "USER32" ()

' Declare Function SetCursorPos Lib "USER32" ()

' Declare Function GetCursorPos Lib "USER32" ()

' Declare Function keybd_event Lib "USER32" ()

' Declare Function SetWindowLongA Lib "USER32" ()

' Declare Function GetWindowLongA Lib "USER32" ()

' Declare Function SetWindowPos Lib "USER32" ()

' Declare Function timeGetTime Lib "winmm.dll" ()

' Declare Function Sleep Lib "kernel32" ()

'Sub Subr_001()
'End Sub

Sub Command1_Click()
End Sub

'Sub Subr_003()
'End Sub

Sub Form_Load()
End Sub

'Sub Subr_005()
'End Sub

'Sub Subr_006()
'End Sub

'Sub Subr_007()
'End Sub

'Sub Subr_008()
'End Sub

'Sub Subr_009()
'End Sub

'Sub Subr_010()
'End Sub

'Sub Subr_011()
'End Sub

'Sub Subr_012()
'End Sub

'Sub Subr_013()
'End Sub

'Sub Subr_014()
'End Sub

'Sub Subr_015()
'End Sub

Sub Form_Unload(Cancel As Integer)
End Sub

Sub Getstate_Timer()
End Sub

Sub INP1_DblClick()
End Sub

Sub INP3_Change()
End Sub

Sub INP2_Change()
End Sub

Sub INP1_Change()
End Sub

Sub INB1_Change()
End Sub

Sub INB2_Change()
End Sub

Sub INB3_Change()
End Sub

'Sub MSFlexGrid1_Event11()
'End Sub

Sub Seemorethan3_Timer()
End Sub

Sub Softstate_Timer()
End Sub

'Sub Subr_028()
'End Sub

'Sub Subr_029()
'End Sub

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

VERSION 5.00
Begin VB.Form Form2
   Caption         =   "Form2"
   ClientHeight    =   5445
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth     =   7500
   LinkTopic       =   "Form2"
   ScaleHeight     =   5445
   ScaleWidth      =   7500
   StartUpPosition =   3
   Begin VB.TextBox Text1
      Height          =   5175
      Left            =   120
      MultiLine       =  -1
      ScrollBars      =   2
      TabIndex        =   0
      Top             =   120
      Width           =   7335
   End
End
Attribute VB_Name = "Form2"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False

' This form rebuilt by VBRezQ v2.4a.  17-May-2008 / 06:57:23
Option Explicit

Sub Text1_DblClick()
End Sub

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 139
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
[QUOTE=;]...[/QUOTE]
' Declare Function GetPixel Lib "gdi32" ()

' Declare Function GetDC Lib "USER32" ()

' Declare Function GetWindowDC Lib "USER32" ()

' Declare Function ReleaseDC Lib "USER32" ()

' Declare Function GetWindowRect Lib "USER32" ()
这几个函数是 关键 建议 lz查查 GetPixel  的用法
另外 像这种  VBRezQ 反编译的框架 拿出来是没用的
2008-6-4 11:48
0
雪    币: 1355
活跃值: (339)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
3
' Declare Function GetPixel Lib "gdi32" ()
说明:在指定的设备场景中取得一个像素的RGB值
返回值:Long,指定点的RGB颜色。如指定的点位于设备场景的剪切区之外,则返回CLR_INVALID
hdc ------------  Long,一个设备场景的句柄
x,y ------------  Long,逻辑坐标中要检查的点

' Declare Function GetDC Lib "USER32" ()
获取指定窗口的设备场景
Long,指定窗口的设备场景句柄,出错则为0
hwnd -----------  Long,将获取其设备场景的窗口的句柄。若为0,则要获取整个屏幕的DC
若窗口所属类具有CS_OWNDC,
  CS_CLASSDC 或 CS_PARENTDC样式,则获取的设备场景属窗口或类专有。vb的窗体和图片框控件也是这种情况,它用该函数取得的结果和控件

的hdc属性相同(在autoredraw为FALSE时)。您无须考虑取回的窗体或图片框控件设备场景的默认状态,特别是绘图对象。另外,默认状态随

着窗体和控件autoredraw属性的设置而不同。在设备场景释放前您必须回复其状态为初始值。对于没有CS_OWNDC,
  CS_CLASSDC 或 CS_PARENTDC样式的窗口的设备场景,可从通用windows缓存中获取,其状态为默认值。缓存中可用设备场景数量是有限的,

因此只要可能就释放设备场景
  用本函数获取的设备场景一定要用ReleaseDC函数释放,不能用DeleteDC

' Declare Function GetWindowDC Lib "USER32" ()
获取整个窗口(包括边框、滚动条、标题栏、菜单等)的设备场景
Long,执行成功为窗口设备场景,失败则为0
hwnd -----------  Long,将获取其设备场景的窗口
不推荐在vb里使用这个函数。用完后一定要用ReleaseDC函数释放场景

' Declare Function ReleaseDC Lib "USER32" ()
释放由调用GetDC或GetWindowDC函数获取的指定设备场景。它对类或私有设备场景无效(但这样的调用不会造成损害)
Long,执行成功为1,否则为0
hwnd -----------  Long,要释放的设备场景相关的窗口句柄
hdc ------------  Long,要释放的设备场景句柄
对那些用CreateDC一类的DC创建函数生成的设备场景,不要用本函数

' Declare Function GetWindowRect Lib "USER32" ()
获得整个窗口的范围矩形,窗口的边框、标题栏、滚动条及菜单等都在这个矩形内
Long,非零表示成功,零表示失败。会设置GetLastError
hwnd -----------  Long,想获得范围矩形的那个窗口的句柄
lpRect ---------  RECT,屏幕坐标中随同窗口装载的矩形
如将它与通过GetDesktopWindow获得的句柄联合使用,可获得对整个可视显示区域(桌面)进行说明的矩形

' Declare Function FindWindowA Lib "USER32" ()
寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;该类

是所有运行中vb执行程序的一部分。获得句柄后,可用api函数GetWindowText取得这个窗口的名称;该名也是应用程序的标题)
Long,找到窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError
lpClassName ----  String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类
lpWindowName ---  String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题
很少要求同时按类与窗口名搜索。为向自己不准备参数传递一个零,最简便的办法是传递vbNullString常数
  示例
  Dim hw& , cnt&
  Dim rttitle As String * 256
  hw&  = FindWindow("ThunderRT5Main", vbNullString) ' ThunderRTMain under VB4
  cnt = GetWindowText(hw& , rttitle, 255)
  MsgBox Left$(rttitle, cnt), 0, "RTMain title"

' Declare Function mouse_event Lib "USER32" ()
模拟一次鼠标事件
dwFlags:标志位集,指定点击按钮和鼠标动作的多种情况。此参数里的各位可以是下列值的任何合理组合:
MOOSE_EVENTF_ABSOLOTE:表明参数dX,dy含有规范化的绝对坐标。如果不设置此位,参数含有相对数据:相对于上次位置的改动位置。此标志

可被设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的设备的类型如何。要得到关于相对鼠标动作的信息,参见下面备注部分


MOOSEEVENTFMOVE:表明发生移动。
M00SEEVENTF_LEFTDOWN:表明接按下鼠标左键。
M00SEEVENTF_LEFTUP:表明松开鼠标左键。
MOOSEEVENTF_RIGHTDOWN:表明按下鼠标右键。
MOOSEEVENTF_RIGHTUP:表明松开鼠标右键。
MOOSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。
MOOSEEVENTF_MIDDLEUP:表明松开鼠标中键。
MOOSEEVENTF_WHEEL:在Windows NT中如果鼠标有一个轮,表明鼠标轮被移动。移动的数量由dwData给出。
dx:指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLOTE的设置。给出的绝对数据作为鼠标的实

际X坐标;给出的相对数据作为移动的mickeys数。一个mickey表示鼠标移动的数量,表明鼠标已经移动。
dy:指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLVTE的设置。给出的绝对数据作为鼠标的实

际y坐标,给出的相对数据作为移动的mickeys数。
dwData:如果dwFlags为MOOSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠标轮向前转动,即远离用户的方向;负值表明鼠标

轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即120。
    如果dwFlagsS不是MOOSEEVENTF_WHEEL,则dWData应为零。
dwExtralnfo:指定与鼠标事件相关的附加32位值。应用程序调用函数GetMessgeExtrajnfo来获得此附加信息。
如果鼠标被移动,用设置MOUSEEVENTF_MOVE来表明,dX和dy保留移动的信息。给出的信息是绝对或相对整数值。
    如果指定了MOWSEEVENTF_ABSOLOTE值,则dX和dy含有标准化的绝对坐标,其值在0到65535之间。事件程序将此坐标映射到显示表面。坐标

(0,0)映射到显示表面的左上角,(6553,65535)映射到右下角。
    如果没指定MOWSEEVENTF_ABSOLOTE,dX和dy表示相对于上次鼠标事件产生的位置(即上次报告的位置)的移动。正值表示鼠标向右(或下

)移动;负值表示鼠标向左(或上)移动。
    鼠标的相对移动服从鼠标速度和加速度等级的设置,一个最终用户用鼠标控制面板应用程序来设置这些值,应用程序用函数

SystemParameterslnfo来取得和设置这些值。
    在应用加速时系统对指定相对鼠标移动提供了两个测试。如果指定的沿X轴y轴的距离比第一个鼠标阈值大,并且鼠标的加速等级非零,则

操作系统将距离加倍。如果指定的沿X轴或y轴的距离比第二个鼠标阈值大,并且鼠标的加速等级为2,则操作系统将从第一个阈测试得来的距离

加倍。这样就允许操作系统将指定鼠标沿X轴或y轴的相对位移加到4倍。
    一旦应用了加速,系统用期望的鼠标速度换算合成的值。鼠标速度的范围是从1(最慢)到20(最快),并代表基于鼠标移动的距离指示符

移动的数量。缺省值是10,表示对鼠标的移动设有附加的修改。
    函数mouse_event需要用的应用程序用来合成鼠标事件。也被应用程序用来取得鼠标位置和鼠标按键状态之外的鼠标信息。例如,如果输入

板制造商想将基于画笔的信息传给自己的应用程序,可以写一个直接与输入板硬件通信的动态键接库(DLL),获得附加的信息,并保存到一个

队列中。DLL然后调用mouse_event,用标准按键和x/y位置数据,并在参数dwExtralnfo设置排列的附加信息的指针或索引。当应用程序需要附

加信息时,调用DLL(连同存贮在dwEXtralnfo中的指针或索引),则DLL返回附加信息。
    Windows CE:Windows CE不支持参数 dwFlags取MOOSE EVENTF WHEEL常数。

'模拟鼠标单击
mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTUP, 0,0, 0, 0
  进行相对运动的时候,由SystemParametersInfo函数规定的系统鼠标轨迹速度会应用于鼠标运行的速度

' Declare Function SetCursorPos Lib "USER32" ()
设置指针的位置
Long,非零表示成功,零表示失败。会设置GetLastError
x,y ------------  鼠标指针在屏幕像素坐标系统中的X,Y位置

' Declare Function GetCursorPos Lib "USER32" ()
获取鼠标指针的当前位置
Long,非零表示成功,零表示失败。会设置GetLastError
lpPoint --------  POINTAPI,随同指针在屏幕像素坐标中的位置载入的一个结构

' Declare Function keybd_event Lib "USER32" ()
这个函数模拟了键盘行动
bVk ------------  Byte,欲模拟的虚拟键码
bScan ----------  Byte,键的OEM扫描码
dwFlags --------  Long,零;或设为下述两个标志之一
KEYEVENTF_EXTENDEDKEY
指出是一个扩展键,而且在前面冠以0xE0代码
KEYEVENTF_KEYUP
模拟松开一个键
dwExtraInfo ----  Long,通常不用的一个值。api函数GetMessageExtraInfo可取得这个值。允许使用的值取决于特定的驱动程序

' Declare Function SetWindowLongA Lib "USER32" ()
在窗口结构中为指定的窗口设置信息
Long,指定数据的前一个值
hwnd -----------  Long,欲为其取得信息的窗口的句柄
nIndex ---------  Long,请参考GetWindowLong函数的nIndex参数的说明
dwNewLong ------  Long,由nIndex指定的窗口信息的新值

' Declare Function GetWindowLongA Lib "USER32" ()
从指定窗口的结构中取得信息
Long,由nIndex决定。零表示出错。会设置GetLastError
hwnd -----------  Long,欲为其获取信息的窗口的句柄
nIndex ---------  Long,欲取回的信息,可以是下述任何一个常数:
GWL_EXSTYLE
扩展窗口样式
GWL_STYLE
窗口样式
GWL_WNDPROC
该窗口的窗口函数的地址
GWL_HINSTANCE
拥有窗口的实例的句柄
GWL_HWNDPARENT
该窗口之父的句柄。不要用SetWindowWord来改变这个值
GWL_ID
对话框中一个子窗口的标识符
GWL_USERDATA
含义由应用程序规定
DWL_DLGPROC
这个窗口的对话框函数地址
DWL_MSGRESULT
在对话框函数中处理的一条消息返回的值
DWL_USER
含义由应用程序规定

' Declare Function SetWindowPos Lib "USER32" ()
这个函数能为窗口指定一个新位置和状态。它也可改变窗口在内部窗口列表中的位置。该函数与DeferWindowPos函数相似,只是它的作用是立

即表现出来的(在vb里使用:针对vb窗体,如它们在win32下屏蔽或最小化,则需重设最顶部状态。如有必要,请用一个子类处理模块来重设最

顶部状态
Long,非零表示成功,零表示失败。会设置GetLastError
hwnd -----------  Long,欲定位的窗口

hWndInsertAfter -  Long,窗口句柄。在窗口列表中,窗口hwnd会置于这个窗口句柄的后面。也可能选用下述值之一:
HWND_BOTTOM
将窗口置于窗口列表底部
HWND_TOP
将窗口置于Z序列的顶部;Z序列代表在分级结构中,窗口针对一个给定级别的窗口显示的顺序
HWND_TOPMOST
将窗口置于列表顶部,并位于任何最顶部窗口的前面
HWND_NOTOPMOST
将窗口置于列表顶部,并位于任何最顶部窗口的后面
x --------------  Long,窗口新的x坐标。如hwnd是一个子窗口,则x用父窗口的客户区坐标表示
y --------------  Long,窗口新的y坐标。如hwnd是一个子窗口,则y用父窗口的客户区坐标表示
cx -------------  Long,指定新的窗口宽度
cy -------------  Long,指定新的窗口高度
wFlags ---------  Long,包含了旗标的一个整数
SWP_DRAWFRAME
围绕窗口画一个框
SWP_HIDEWINDOW
隐藏窗口
SWP_NOACTIVATE
不激活窗口
SWP_NOMOVE
保持当前位置(x和y设定将被忽略)
SWP_NOREDRAW
窗口不自动重画
SWP_NOSIZE
保持当前大小(cx和cy会被忽略)
SWP_NOZORDER
保持窗口在列表的当前位置(hWndInsertAfter将被忽略)
SWP_SHOWWINDOW
显示窗口
SWP_FRAMECHANGED
强迫一条WM_NCCALCSIZE消息进入窗口,即使窗口的大小没有改变
窗口成为最顶级窗口后,它下属的所有窗口也会进入最顶级。一旦将其设为非最顶级,则它的所有下属和物主窗口也会转为非最顶级。Z序列用

垂直于屏幕的一根假想Z轴量化这种从顶部到底部排列的窗口顺序

' Declare Function timeGetTime Lib "winmm.dll" ()
返回WINDOWS运行时间

' Declare Function Sleep Lib "kernel32" ()
暂停线索
2008-6-4 12:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
太棒了!!十分感激您的指点!再次感谢!佩服!要知道这个问题在论坛好久都没有人能够答复的呀!
2008-6-4 21:39
0
游客
登录 | 注册 方可回帖
返回
//