明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5063|回复: 14

VB做外挂编程入门(转)

  [复制链接]
发表于 2007-1-30 15:19:00 | 显示全部楼层 |阅读模式
1.查找目标窗口.需要做外挂,就需要查找目标窗口.然后才做一些其他的动作.比如说鼠标键盘模拟啦.内存修改啦.封包型发送与替换啦什么什么的
-------------------------------------------------------------------------------------------------
'定义模块
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'在窗口中建立一timer(时间控制器),然后在代码窗口输入如下代码:
Private Sub Form_Load()
Timer1.Interval = 500
End Sub

时间控制器的代码如下:
Private Sub Timer1_Timer()
 Dim hwnd As Long
       hwnd = FindWindow(vbNullString, "计算器") '抓取"计算器"这个窗口名称.
If (hwnd = 0) Then
  If MsgBox("你没有打开[计算器]程序!点击“确定”退出。点“取消”继续。", 49, "错误!") = 1 Then End
ElseIf (hwnd <> 0) Then
MsgBox "你已经打开了[计算器]程序.点“确定”退出本程序", , "退出"
End
End If
End Sub
 楼主| 发表于 2007-1-30 15:20:00 | 显示全部楼层
2.以下为模拟键盘事件.比如模拟"r"键.
----------------------------------------------------------------------------------------------------------------------------
 '在模块中定义 
 ublic Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long) 

在窗口中建立一timer.时间间隔随意.只要不是0就可以了哦.呵呵.
Private Sub Timer1_Timer()
Call keybd_event(82, 0, 0, 0) '模拟按下"R"键
End Sub
 楼主| 发表于 2007-1-30 15:21:00 | 显示全部楼层
3.以下为快捷键例子.比如按下"ctrl+A"就退出!
'可以设置Form的KeyPreview属性为True,然后在Form_KeyDown事件中添加代码: 
 rivate Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) 
If KeyCode = Asc("A") And Shift = vbCtrlMask Then unload me '如果ctrl+A键被按下就退出
 End Sub 


例二:
在Form中加入
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As Integer
Private Function MyHotKey(vKeyCode) As Boolean
MyHotKey = (GetAsyncKeyState(vKeyCode) < 0)
 End Function
'然后在循环中或Timer的Timer事件中检测:
Private Sub Timer1_Timer()
If MyHotKey(vbKeyA) And vbKeyControl Then 'ctrl+A
End '关闭
End If
'其中vbkeyA是键盘〃A〃的常数,其他键可按F1查得。
End Sub
 楼主| 发表于 2007-1-30 15:22:00 | 显示全部楼层
取得窗口的句柄.类.名称等 

建立三个label1/label2/lebel3/
名称分别为窗口句柄/类/标题/
建立一个text窗口
建立二个command按钮,一为开始抓取。一为退出

声明:
Private Type OINTAPI
 x As Long
 y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" (lpPoint As OINTAPI) 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 GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Private Sub Command1_Click()
If Command1.Caption = "开始抓取(&S)" Then
Timer1.Enabled = True
Command1.Caption = "停止抓取(&S)"
Else
Timer1.Enabled = False
Command1.Caption = "开始抓取(&S)"
End If
End Sub

Private Sub Command2_Click()
End
End Sub

Private Sub Form_Load()
SetWindowPos Me.hwnd, -1, 0, 0, 0, 0, &H1 Or &H2 '使窗体位于最顶端
End Sub

Private Sub Timer1_Timer()
On Error Resume Next
Dim tPoint As OINTAPI
Dim hWin As Long
Dim str As String * 255
Dim Abc As String * 64000
Dim Txt(64000) As Byte
GetCursorPos tPoint '获得当前鼠标位置
hWin = WindowFromPoint(tPoint.x, tPoint.y) '获得窗口名柄
If hWin = Me.hwnd Or hWin = Command1.hwnd Or hWin = Command2.hwnd Or hWin = Text1.hwnd Then Exit Sub '确定窗口不在 Form1 中
GetClassName hWin, str, 255 '获得窗口类
SendMessage hWin, &HD, 64000, Txt(0) '获得窗口标题(也可使用 API 函数:GetWindowText,但效果不佳)
Label1.Caption = "窗口名柄: " & hWin
Label2.Caption = "窗口类: " & str
Text1.Text = StrConv(Txt, vbUnicode)
End Sub
 楼主| 发表于 2007-1-30 15:25:00 | 显示全部楼层
2.模拟鼠标显示.隐藏 
隐藏/显示鼠标.

Public Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long

'forml中函数如下
'隐藏鼠标(需要事件击活,比如窗体事件等)
ShowCursor False
'显示鼠标(需要事件击活,比如窗体事件等)
ShowCursor True
 3.定位鼠标,使之不能移动 
定位鼠标。

Type rect
 sbleft As Long
 sbtop As Long
 sbright As Long
 sbbottom As Long
End Type

Public Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long


'鼠标定位
Private Sub Form_Load()
'定位鼠标
 Dim x As Long, y As Long
 Dim newrect As rect
 x& = Screen.TwipsPerPixelX
 y& = Screen.TwipsPerPixelY
 
 With newrect '鼠标只能在500,500-500,500这个范围内移动,如果四个数一样也可以说锁定鼠标了.如果加在记时器里的话就移动不了啦.
 .sbleft = 500
 .sbtop = 500
 .sbright = 500
 .sbbottom = 500
 End With
 
 ClipCursor newrect
如果鼠标被锁定,不能恢复怎么办?不用担心.看如下代码.
'使鼠标恢复(设定一个事件.才好击活这个代码.)
 Dim newrect As rect
 With newrect '这样鼠标又可以在0,0-屏幕的最右角,屏幕的最右下脚移动了
 .sbleft = 0
 .sbtop = 0
 .sbright = Screen.Width / Screen.TwipsPerPixelX
 .sbbottom = Screen.Height / Screen.TwipsPerPixelY
 End With
 
 ClipCursor newrect
 End Sub
 楼主| 发表于 2007-1-30 15:27:00 | 显示全部楼层
一些控制鼠标的例子! 
 1.模拟鼠标击键过程 
'声明:
Option Explicit
 rivate 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 )

'对变量的定义
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4
Const MOUSEEVENTF_MIDDLEDOWN = &H20
Const MOUSEEVENTF_MIDDLEUP = &H40
Const MOUSEEVENTF_MOVE = &H1
Const MOUSEEVENTF_ABSOLUTE = &H8000
Const MOUSEEVENTF_RIGHTDOWN = &H8
Const MOUSEEVENTF_RIGHTUP = &H10

 '这里是 鼠标左键按下 和松开两个事件的组合即一次单击
 mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0

 '模拟鼠标右键单击事件
 mouse_event MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0

 '两次连续的鼠标左键单击事件 构成一次鼠标双击事件
 mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
 mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
 楼主| 发表于 2007-1-30 15:28:00 | 显示全部楼层
窗口类函数 


SetWindowPos函数:使窗口停留在屏幕最顶层。
声明:
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 Sub Form_Load()
SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, &H2 + &H1
End Sub 窗口form1将保留在屏幕表面。
该函数功能是为窗口指定1个新的位置和状态。参数:
hwnd:欲定位的窗口。
hwndinsertAfter:指定窗口的位置。 可能选用下述值之一: 
HWND_BOTTOM 将窗口置于窗口列表底部 
HWND_TOP 将窗口置于Z序列的顶部;Z序列代表在分级结构中,窗口针对一个给定级别的窗口显示的顺序 
HWND_TOPMOST(值-1) 将窗口置于列表顶部,并位于任何最顶部窗口的前面 
HWND_NOTOPMOST(值-2) 将窗口置于列表顶部,并位于任何最顶部窗口的后面 
x: 窗口新的x坐标。如hwnd是一个子窗口,则x用父窗口的客户区坐标表示 
y: 窗口新的y坐标。如hwnd是一个子窗口,则y用父窗口的客户区坐标表示 
cx:指定新的窗口宽度 
cy:指定新的窗口高度 
wFlags:包含了游标的一个整数,可能为下述值或其组合。 
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消息进入窗口,即使窗口的大小没有改变 
======
移动无标题栏的窗口:在标准模块中声明
Declare Function ReleaseCapture Lib "user32" () As Long
ReleaseCapture函数:为当前程序释放鼠标捕获。
Declare Function SendMessage Lib "user32" _
Alias "SendMessageA" ( _
ByVal hwnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, lParam As Any) As Long
Public Const HTCAPTION = 2
Public Const WM_NCLBUTTONDOWN = &HA1 此消息指在窗口的非客户区域内按下左键
在FORM_mousedown事件中写:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture (此句为释放鼠标本来在Form客户区的捕获)
SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
End Sub
====
创建椭圆(不规则)窗口:SetWindowRgn函数结合CreateEllipticRgn椭圆函数
SetWindowRgn函数用来创建不规则窗口,如椭圆(结合CreateEllipticRgn),多边形(结合CreatePolygonRgn),矩形(结合CreateRectRgn),圆角矩形(结合CreateRoundRectRgn)等。 
声明:
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, _
ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
调用如:
Private Sub Form_Load()
SetWindowRgn hWnd, CreateEllipticRgn(0, 0, 300, 200), True
End Sub
SetWindowRgn函数用于创建不规则窗口,可创建任何几何形状的窗口,只要用Create…Rgn函数返回值传入各种形状区域句柄,参数:
参数 类型及说明 
hWnd:将设置其区域的窗口的句柄。 
hRgn:设置好的区域的句柄,一旦设置了该区域,就不能使用或修改该区域句柄,也不要删除它 
bRedraw:是否立即重画窗口,若为TRUE,则立即重画窗口 
注:为区域指定的所有坐标都以窗口坐标(和客户坐标不完全相同)表示,它们以整个窗口(包括标题栏和边框,而客户坐标是指不包括标题栏的窗口内部有效区域)的左上角为起点
 楼主| 发表于 2007-1-30 15:32:00 | 显示全部楼层
椭圆CreateEllipticRgn函数:创建一个椭圆,该椭圆以X1,Y1和X2,Y2坐标点确定的矩形内切。参数:
X1,Y1:内切矩形左上角X,Y坐标 
X2,Y2:内切矩形右下角X,Y坐标 
====
得到屏幕有效区大小(除去任务条):SystemParametersInfoA
声明:
Private Type RECT 
Left As Long
top As Long
Right As Long
Botton As Long
End Type
Private Declare Function SystemParametersInfoA Lib "user32" _
(ByVal uAction As Long, ByVal uParam As Long, ByRef lpvparam _
As Any, ByVal fuWinIni As Long) As Long
调用如:将窗体移到屏幕有效区中央。
Private Sub Command2_Click()
Dim ScreenWidth&
Dim ScreenHeight&
Dim ScreenLeft&
Dim ScreenTop&
Dim DesktopArea As RECT
Const SPI_GETWORKAREA = 48 
Call SystemParametersInfoA(SPI_GETWORKAREA, 0, DesktopArea, 0)
ScreenHeight = (DesktopArea.Botton - DesktopArea.top) * Screen.TwipsPerPixelY
ScreenWidth = (DesktopArea.Right - DesktopArea.Left) * Screen.TwipsPerPixelX
ScreenLeft = DesktopArea.Left * Screen.TwipsPerPixelX
ScreenTop = DesktopArea.top * Screen.TwipsPerPixelY
Form1.Move (ScreenWidth - Form1.Width) / 2 + ScreenLeft, (ScreenHeight - Form1.Height) / 2 + ScreenTop
End Sub
SystemParametersInfoA函数可用来获取和设置数量众多的windows系统参数。
参数请查看资料。
====
获得窗口在屏幕上的范围:GetWindowRect函数
包括窗口的边框,标题栏,滚动条及菜单,客户区等在内,即整个窗口在屏幕上所占的范围.声明:
Declare Function GetWindowRect Lib "user32"(ByVal hwnd As Long, lpRect As RECT) As Long
第一个参数是窗口句柄,第二个参数装载窗口范围的坐标值,为一个结构类型,声明如下:
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
该参数返回窗口在屏幕中的范围值,单位为象素。调用如:
Private Sub Command1_Click()
GetWindowRect Command1.hwnd, lxx
Print lxx.Left, lxx.Top, lxx.Right, lxx.Bottom 
End Sub
===========================================
改变指定窗口的位置和大小:MoveWindow函数
相当于VB内置的Move方法,但作为API,功能当然更强大,它可对任何非本进程的窗口进行改变,声明:
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
第一个参数为要移动的窗口句柄,第二,三,四,五个参数为窗口移动后的新横坐标,新纵坐标,新宽度,新高度,第六个参数为是否立即对窗口进行重画,用True或False。调用如:
MoveWindow Command1.hwnd, 0, 0, 100, 100, True
因为改变的是对象在父窗口中的位置,所以Command1按纽被移到窗体Form1的客户区左上角去了。 
=====
判断屏幕上1指定点的客户区坐标:ScreenToClient函数 
判断屏幕上某点相对于指定窗口内的坐标。声明:
Private Type OINTAPI
x As Long
y As Long
End Type
Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As OINTAPI) As Long
该函数用以测量点lpPoint在句柄为hwnd的窗口内的坐标(如超越此窗口则为负数)。调用如:
Private Sub Command1_Click()
Dim lxn As OINTAPI
lxn.x = 100: lxn.y = 100
Call ScreenToClient(Form1.hwnd, lxn)
Print lxn.x, lxn.y
End Sub
上例在调用前的lxn参数100,100是屏幕坐标,调用函数后lxn的值是"屏幕坐标为(100,100)的点在form1中的客户坐标是多少。如返回lxn.x=41,lxn.y=38,单位仍为象素,不会变为form1内部的缇。
 楼主| 发表于 2007-1-30 15:34:00 | 显示全部楼层
获得窗口内以客户坐标表示的1个点的屏幕坐标 : ClientToScreen函数
该函数与上面那个正好相反。这里是已知客户坐标求屏幕坐标。注:客户坐标单位须先转为象素。
声明:
Declare Function ClientToScreen Lib "user32"(ByVal hwnd As Long, lpPoint As OINTAPI) As Long
参数hwnd:点所在的客户区窗口的句柄。
参数lpPoint:传入点的客户区坐标(单位要为象素),并返回点的屏幕坐标(象素)。
调用如: 
Dim m As OINTAPI
m.X = 50: m.Y = 70
a = ClientToScreen(Form1.hwnd, m)
Print m.X, m.Y
该函数应用的是参数lpPoint返回值。 
======
获得屏幕上某指定点所在的窗口的句柄 : WindowFromPoint函数 
声明:
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
参数xPoint,yPoint是某点的"屏幕坐标"。函数返回值为包含该点的窗口句柄。
调用如:
Private Sub Command2_Click()
Dim hwnd As Long
hwnd = WindowFromPoint(1, 1)
Print hwnd
End Sub
上例表示屏幕上点(1,1)处在句柄为hwnd的窗口内。
此函数返回的句柄不包含隐藏、屏蔽、透明窗口的。如果要指出屏幕上某点所属的所有窗口,就请用ChildWindowFromPoint函数。
=========== 获取屏幕上某个窗口内某点的颜色值: GetPixel函数
该函数在指定设备场景中取得1个象素的颜色RGB值。
声明:
Public Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
参数:
hDC--指定一个设备场景(即显示设备描述表)的句柄。
x,y--某点在该设备场景中的(x,y)坐标。以该设备场景的坐标系统来度量。
调用如:
……
hDC=GetDC(hwnd)
lxn=GetPixel(hDC,50,50) 
Picture1.BackColor=lxn
注:指定的点不能位于设备场景的区域外。如上例(50,50)在hDC所属窗口区域内
====
EnableWindow函数:让窗口拒绝接受鼠标和键盘事件
使用此函数,可以让1个窗口不响应任何鼠标键盘操作。如果是VB内部的窗体或控件,则相当于它的Enabled属性。
声明:
Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
调用如: Call EnableWindow(Form1.hwnd, 0)为拒绝接受鼠标和键盘事件,
调用如: Call EnableWindow(Form1.hwnd, 1)为允许接受键盘和鼠标事件。
参数:hwnd不用说,就是一个窗口句柄,fEnable参数:窗口是否响应操作。为零禁止操作窗口,非零允许操作窗口。
=====
ShowWindow函数:显示或隐藏指定句柄的窗口
将1个隐藏的窗口显示出来,有意思,相当于VB自身内部控件的visible属性。而且超越于此,它还能指定显示时是否最大化,最小化等,声明如下:
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long 
调用如:
Const SW_HIDE = 0 参数nCmdShow之一,隐藏窗口
Const SW_SHOW = 5 显示窗口 
i = ShowWindow(form1.hwnd, SW_HIDE)
参数:
hwnd: Long,窗口句柄,要向这个窗口应用由nCmdShow指定的命令 
nCmdShow: Long,为窗口指定显示或隐藏的一个命令。请用下述任何一个常数 
SW_HIDE 隐藏窗口,活动状态给令一个窗口 
SW_MINIMIZE 最小化窗口,活动状态给令一个窗口 
SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态 
SW_SHOW=5 用当前的大小和位置显示一个窗口,同时令其进入活动状态 
SW_SHOWMAXIMIZED=3 最大化窗口,并将其激活 
SW_SHOWMINIMIZED=2 最小化窗口,并将其激活 
SW_SHOWDEFAULT=10 按窗口本来的方式显示,并激活。
SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口 
SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口 
 楼主| 发表于 2007-1-30 15:35:00 | 显示全部楼层
SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口 
SW_SHOWNORMAL 与SW_RESTORE相同 
注:各常数的值请查阅API浏览器中的constants(常数列表)。
======
关闭指定句柄的窗口:SendMessageA的WM_CLOSE消息 
SendMessageA的声明在前面有,消息WM_CLOSE的值为&H10,后两个参数为空,用0&。函数返回值若为0表示程序处理了此消息。调用如下:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const WM_CLOSE = &H10
Private Sub Command1_Click()
SendMessage Form1.hwnd, WM_CLOSE, 0&, 0&
End Sub
还有一个强制从内存中清除窗口的函数:DestroyWindow函数
其功能是直接清除掉内存中的1个窗口,返回非0表示成功,返回0表示失败。声明:
Public Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long)
很简单,参数只是指定1个窗口句柄。调用如:DestroyWindow Form1.hwnd。
=====
寻找窗口列表中第一个符合条件的父窗口: FindWindowA函数 
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
函数返回找到的窗口的句柄。比如要查找标题为"未命名-记事本"的窗口句柄:
hWndTmp = FindWindowA(vbNullString,"未命名-记事本") 二个参数均为字符串,如果某个为空,则用vbNullString或0&补上。
参数:
lpClassName:某窗口类名,或设为零或vbNullString,表示接收任何类 
lpWindowName:某窗口标题,或设为零或vbNullString,表示接收任何窗口标题 。
该函数常用来查找ThunderRTMain窗口类的隐藏窗口的句柄。例如:
Dim hw&, cnt&
Dim rttitle As String * 256
hw& = FindWindowA("ThunderRT5Main", vbNullString) 
cnt = GetWindowText(hw&, rttitle, 255)
MsgBox Left$(rttitle, cnt), 0, "RTMain title" 
=====
根据1个窗口句柄返回另1个相关窗口句柄 :GetWindow函数
传入一个源窗口句柄,返回另1个与之有关的窗口句柄,如源窗口的下1个兄弟窗口,第1个子窗口等。声明:
Declare Function GetWindow Lib "user32"(ByVal hwnd As Long, ByVal wCmd As Long) As Long
调用如:
Const GW_HWNDNEXT = 2 
hWndlxn = GetWindow(hWndTmp, GW_HWNDNEXT)
参数:hwnd:源窗口句柄。 
wCmd参数:指定结果窗口与源窗口的关系,它们建立在下述常数基础上: 
GW_CHILD 寻找源窗口的第一个子窗口 
GW_HWNDFIRST 为一个源子窗口寻找第一个兄弟(同级)窗口,或寻找第一个顶级窗口 
GW_HWNDLAST 为一个源子窗口寻找最后一个兄弟(同级)窗口,或寻找最后一个顶级窗口 
GW_HWNDNEXT 为源窗口寻找下一个兄弟窗口 
GW_HWNDPREV 为源窗口寻找前一个兄弟窗口 
GW_OWNER 寻找窗口的所有者 
注解 
兄弟或同级是指在整个分级结构中位于同一级别的窗口。如某个窗口有五个子窗口,那五个窗口就是兄弟窗口。尽管GetWindow可用于枚举窗口,但倘若要在枚举过程中重新定位、创建和清除窗口,那么EnumWindows和EnumChildWindows更为可靠。
=====
GetWindowLongA函数:获得指定窗口某方面的结构信息(返回长整数)。
问题:什么叫"窗口的结构数据信息"?就是1个窗口的诸方面情况吧,象人有姓名性别年龄等一样,窗口有"扩展样式(包含标题栏,如在Form1中表现为BorderStyle属性,有标题栏缩小、无标题栏等的组合值)","样式(包含滚动条、系统菜单、边框等可设置)","父窗口","子窗口","窗口函数"等诸多方面,见下面nIndex参数值。这些方面的内容(每1方面只能有1个当前值)就构成了窗口的结构信息。
该函数从附加窗口内存中返回1个长整数值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 18:21 , Processed in 0.194658 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表