以下是用VB做外挂的一些知识_第1页
以下是用VB做外挂的一些知识_第2页
以下是用VB做外挂的一些知识_第3页
以下是用VB做外挂的一些知识_第4页
以下是用VB做外挂的一些知识_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、以下是用VB做外挂的一些知识.我个人认 为是入门的一些知识.不敢独享.贴出来给大 家!有时间随时补充呵呵查找目标窗口 .需要做外挂,就需要查找目 标窗口 .然后才做一些其他的动作.比如说鼠 标键盘模拟啦.内存修改啦.封包型发送与替 换啦什么什么的定义模块Declare Function FindWindow Lib user32 A lias FindWindowA (ByVal IpClassName As String, ByVal lpWindowName As String) As L ong在窗口中建立一 timer(时间控制器),然后在 代码窗口输入如下代码:Private Sub

2、 Form_Load()Timerl.Interval = 500End Sub时间控制器的代码如下:Private Sub Timer1_Timer()Dim hwnd As Longhwnd = FindWindow(vbNullString,计算 器)抓取计算器”这个窗口名称.If (hwnd = 0) ThenIf MsgBox(你没有打开计算器程序!点击 “确定”退出。点“取消”继续。,49,”错误! )=1 Then EndElself (hwnd 0) ThenMsgBox ”你已经打开了 计算器程序.点“确 定”退出本程序”,,退出”EndEnd IfEnd Sub2.以下为模

3、拟键盘事件.比如模拟r键.在模块中定义Public Declare Sub keybd_event Lib user32(ByVal bVk As Byte, ByVal Scan As Byt e, ByVal dwFlags As Long, ByVal dwExtraIn fo As Long)在窗口中建立一 timer,时间间隔随意.只要不 是0就可以了Private Sub Timer1_Timer()Call keybd_event(82, 0, 0, 0)模拟按下”R”键End Sub3,以下为快捷键例子,比如按下ctrl+A”就退 出!可以设置Form的KeyPreview属性

4、为True, 然后在Form_KeyDown事件中添加代码: Private Sub Form_KeyDown(KeyCode As Int eger, Shift As Integer)If KeyCode = Asc(A) And Shift = vbCtrlMa sk Then unload me 如果ctrl+A键被按下就 退出End Sub例二:在Form中加入Private Declare Function GetAsyncKeyState L ib user32 (ByVal vkey As Long) As IntegerPrivate Function MyHotKey(vK

5、eyCode) As B ooleanMyHotKey = (GetAsyncKeyState(vKeyCode) 0)End Function然后在循环中或Timer的Timer事件中检测:Private Sub Timer1_Timer()If MyHotKey(vbKeyA) And vbKeyControl T hen ctrl+AEnd 关闭End If其中vbkeyA是键盘 A 的常数,其他键 可按F1查得。End Sub取得窗口的句柄,类,名称等建立三个 label1/label2/lebel3/ 名称分别为窗口句柄/类/标题/ 建立一个text窗口建立二个command按钮,一

6、为开始抓取。 一为退出声明:Private Type POINTAPIx As Long y As Long End TypePrivate Declare Function GetCursorPos Lib u ser32 (lpPoint As POINTAPI) As LongPrivate Declare Function SetWindowPos Lib user32 (ByVal hwnd As Long, ByVal hWndI nsertAfter As Long, ByVal x As Long, ByVa l y As Long, ByVal cx As Long, ByV

7、al cy A s Long, ByVal wFlags As Long) As Long Private Declare Function GetClassName Lib user32 Alias GetClassNameA (ByVal hwn d As Long, ByVal lpClassName As String, By Val nMaxCount As Long) As LongPrivate Declare Function SendMessage Lib u ser32 Alias SendMessageA (ByVal hwn d As Long, ByVal wMsg

8、As Long, ByVal wP aram As Long, lParam As Any) As Long Private Declare Function WindowFromPoin t Lib user32 (ByVal xPoint As Long, ByVa l yPoint As Long) As LongPrivate Declare Function GetWindowLong Li b user32 Alias GetWindowLongA (ByVa l hwnd As Long, ByVal nIndex As Long) A s LongPrivate Declare

9、 Function GetWindowText Li b user32 Alias GetWindowTextA (ByVa l hwnd As Long, ByVal lpString As String, By Val cch As Long) As LongPrivate Sub Command1_Click()If Commandl.Caption =开始抓取(&S) The nTimerl.Enabled = TrueCommandl.Caption =停止抓取(&S)ElseTimerl.Enabled = FalseCommandl.Caption =开始抓取(&S)End If

10、End SubPrivate Sub Command2_Click()EndEnd SubPrivate Sub Form_Load()SetWindowPos Me.hwnd, -l, 0, 0, 0, 0, &H l Or &H2 使窗体位于最顶端End SubPrivate Sub Timerl_Timer()On Error Resume NextDim tPoint As POINTAPIDim hWin As LongDim str As String * 255Dim Abc As String * 64000Dim Txt(64000) As ByteGetCursorPos

11、tPoint 获得当前鼠标位置 hWin = WindowFromPoint(tPoint.x, tPoint.y)获得窗口名柄If hWin = Me.hwnd Or hWin = Commandl.h wnd Or hWin = Command2.hwnd Or hWi n = Textl.hwnd Then Exit Sub 确定窗口不 在Forml中GetClassName hWin, str, 255 获得窗口类 SendMessage hWin, &HD, 64000, Txt(0)获 得窗口标题(也可使用API函数:GetWindow Text,但效果不佳)Labell.Capt

12、ion = ”窗口名柄:& hWin Label2.Caption =窗 口类:& str Textl.Text = StrConv(Txt, vbUnicode) End SubOption ExplicitPrivate Declare Function FindWindow Lib us er32 Alias FindWindowA (ByVal lpClassN ame As String, ByVal lpWindowName As Stri ng) As LongPrivate Declare Function GetWindowThreadP rocessId Lib user3

13、2 (ByVal hWnd As Lon g, lpdwProcessId As Long) As LongPrivate Declare Function OpenProcess Lib ke rnel32 (ByVal dwDesiredAccess As Long, B yVal bInheritHandle As Long, ByVal dwProc essId As Long) As LongPrivate Declare Function WriteProcessMemor y Lib kernel32 (ByVal hProcess As Long, B yVal lpBaseA

14、ddress As Any, lpBuffer As An y, ByVal nSize As Long, lpNumberOfBytesW ritten As Long) As LongPrivate Declare Function ReadProcessMemor y Lib kernel32 (ByVal hProcess As Long, B yVal lpBaseAddress As Any, lpBuffer As An y, ByVal nSize As Long, lpNumberOfBytesW ritten As Long) As LongPrivate Declare

15、Function CloseHandle Lib ke rnel32 (ByVal hObject As Long) As Long Private Const PROCESS_ALL_ACCESS = & H1F0FFFPrivate hProcess As Long下面的函数用于查找游戏Function FindGame() As BooleanDim PID As Long, Gamehwnd As Long FindGame = FalseGamehwnd = FindWindow(vbNullString,蜘 蛛)查找游戏的句柄If (Gamehwnd = 0) Then 如果找不到

16、(例如游戏未运行)就退出函数MsgBox ”没有找到蜘蛛游戏”Exit FunctionEnd IfGetWindowThreadProcessId Gamehwnd, PID 取得进程IDhProcess = OpenProcess(PROCESS_ALL_ACCESS, False, PID)以全部权力打开进程If (hProcess = 0) Then 打开进程失败MsgBox ”没有打开进程”Exit FunctionEnd IfFindGame = True 成功!!End Function回到VB的窗口设计模式,在窗体上放上两 个按钮和一个文本框一个按钮为”读取”一个为”写入,分别

17、用于读取和写入数据把Textl的Text设为空白Private Sub Command1_Click()Dim retV%, r&Dim retV%, r&=Dim retV As Integer, r As Lo ngIf FindGame Thenr = ReadProcessMemory(hProcess, &H1011F20, retV, 2, 0)这里重要,&H1011F20 为内存 位置.If r = 0 ThenMsgBox ”读取内存不成功!”ElseText1 = retVEnd IfEnd IfEnd SubPrivate Sub Command2_Click()Dim r

18、&If FindGame Thenr = WriteProcessMemory(hProcess, &H1011F 20, CInt(Val(Text1), 2, 0)参数与上面的基本相同cInt(Val(Text1)是防止输入的过程有误,例 如,输入了字母,,如果不处理程序就会出错If r = 0 ThenMsgBox ”写内存不成功!”ElseMsgBox OKEnd IfEnd IfEnd Sub一些控制鼠标的例子!1.模拟鼠标击键过程声明:Option ExplicitPrivate Declare Sub mouse_event Lib user32 (ByVal dwFlags A

19、s Long, ByVal dx As Lon g, ByVal dy As Long, ByVal cButtons As Lon g, ByVal dwExtraInfo As Long )对变量的定义Const MOUSEEVENTF_LEFTDOWN = &H 2Const MOUSEEVENTF_LEFTUP = &H4Const MOUSEEVENTF_MIDDLEDOWN = &H20Const MOUSEEVENTF_MIDDLEUP = &H4 0Const MOUSEEVENTF_MOVE = &H1Const MOUSEEVENTF_ABSOLUTE = &H8 000C

20、onst MOUSEEVENTF_RIGHTDOWN = & H8Const MOUSEEVENTF_RIGHTUP = &H10这里是鼠标左键按下和松开两个事件的组合即一次单击mouse_event MOUSEEVENTF_LEFTDOW N Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0模拟鼠标右键单击事件mouse_event MOUSEEVENTF_RIGHTDO WN Or MOUSEEVENTF_RIGHTU P, 0, 0, 0, 0两次连续的鼠标左键单击事件构成一次鼠 标双击事件mouse_event MOUSEEVENTF_LEFTDOW N Or MOU

21、SEEVENTF_LEFTUP, 0, 0, 0, 0 mouse_event MOUSEEVENTF_LEFTDOW N Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0模拟鼠标显示.隐藏 隐藏/显示鼠标.Public Declare Function ShowCursor Lib use r32 (ByVal bShow As Long) As Longforml中函数如下隐藏鼠标(需要事件击活,比如窗体事件等)ShowCursor False显示鼠标(需要事件击活,比如窗体事件等)ShowCursor True定位鼠标,使之不能移动 定位鼠标。Type rectsble

22、ft As Longsbtop As Longsbright As Longsbbottom As Long End TypePublic Declare Function ClipCursor Lib user32” (IpRect As Any) As Long鼠标定位Private Sub Form_Load()定位鼠标Dim x As Long, y As LongDim newrect As rectx& = Screen.TwipsPerPixelXy& = Screen.TwipsPerPixelYWith newrect 鼠标只能在 500,500-500,500 这个范围内移

23、动,如果四个数一样也可以说 锁定鼠标了 .如果加在记时器里的话就移动 不了啦.,sbleft = 500.sbtop = 500.sbright = 500.sbbottom = 500End WithClipCursor newrect如果鼠标被锁定,不能恢复怎么办?不用担心. 看如下代码.使鼠标恢复(设定一个事件.才好击活这个代 码.)Dim newrect As rectWith newrect这样鼠标又可以在0,0-屏幕的 最右角,屏幕的最右下脚移动了.sbleft = 0.sbtop = 0.sbright = Screen.Width / Screen.TwipsPerPix el

24、X.sbbottom = Screen.Height / Screen.TwipsPer PixelYEnd WithClipCursor newrectEnd Sub移动鼠标到某某点 移动鼠标.Public Declare Function SetCursorPos Lib us er32 (ByVal x As Long, ByVal y As Long) A s Long窗口函数如下:SetCursorPos 0, 0 鼠标移动到 0,0 点鼠标坐标 鼠标坐标.Type POINTAPIx As Longy As LongEnd TypePublic Declare Function G

25、etCursorPos Lib us er32 (lpPoint As POINTAPI) As Long 鼠标坐标:在窗口中设立一记时器。一显示框。Dim z As POINTAPIGetCursorPos zLabell.Caption = x: & z.x & y: & z.y 设定一个显示点labell.鼠标键数鼠标键数.Public Declare Function GetSystemMetrics Li b user32 (ByVal nIndex As Long) As Long鼠标键数Dim mousebtn As Longmousebtn = GetSystemMetrics

26、(43) Labell.Caption =你的鼠标是& mousebt n & 键鼠标!”设定一个显示点labell.以上也可以使用其他方式模拟.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)

27、As Long 调用如:Private Sub Form_Load()SetWindowPos hwnd, HWND_TOPMOST, 0, 0, 0, 0, &H2 + &H1End Sub窗口 form1将保留在屏幕表面。 该函数功能是为窗口指定1个新的位置和状 态。参数:hwnd:欲定位的窗口。hwndinsertAft er:指定窗口的位置。可能选 用下述值之一:HWND_BOTTOM将窗口置于窗口列表底 部HWND_TOP将窗口置于Z序列的顶部;Z 序列代表在分级结构中,窗口针对一个给定 级别的窗口显示的顺序HWND_TOPMOST (值-1)将窗口置于列 表顶部,并位于任何最顶部窗

28、口的前面 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保持当前

29、大小(cx和cy会被 忽略)SWP_NOZORDER保持窗口在列表的当前 位置(hWndInsertAfter将被忽略) SWP_SHOWWINDOW 显示窗口SWP_FRAMECHANGED 强迫一条 WM_NCCALCSIZE消息进入窗口,即使窗 口的大小没有改变 移动无标题栏的窗口:在标准模块中声明Declare Function ReleaseCapture Lib user32 () As LongReleaseCapture函数:为当前程序释放鼠标 捕获。Declare Function SendMessage Lib user32 _ Alias SendMessageA ( _

30、ByVal hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long, lParam As Any) As L ongPublic Const HTCAPTION = 2Public Const WM_NCLBUTTONDOWN = &HA1此消息指在窗口的非客户区域内按下 左键在FORM_mousedown事件中写:Private Sub Form_MouseDown(Button As Int eger, Shift As Integer, X As Single, Y As Singl e)ReleaseCapture (此句为释放鼠标本

31、来在 Form客户区的捕获)SendMessage hwnd, WM_NCLBUTTONDO WN, HTCAPTION, 0&End Sub创建椭圆(不规则)窗口: SetWindowRgn 函数结合CreateEllipticRgn椭圆函数 SetWindowRgn函数用来创建不规则窗口, 如椭圆(结合CreateEllipticRgn),多边形(结 合 CreatePolygonRgn),矩形(结合 CreateRectRgn),圆角矩形(结合 CreateRoundRectRgn)等。声明:Private Declare Function CreateEllipticRgn Li b

32、gdi32 (ByVal X1 As Long, ByVal Y1 As L ong, ByVal X2 As Long, ByVal Y2 As Long) As LongPrivate Declare Function SetWindowRgn Lib user32 (ByVal hWnd As Long, _ByVal hRgn As Long, ByVal bRedraw As Boo lean) As Long调用如:Private Sub Form_Load()SetWindowRgn hWnd, CreateEllipticRgn(0, 0 ,300, 200), TrueEnd

33、 SubSetWindowRgn函数用于创建不规则窗口, 可创建任何几何形状的窗口,只要用 CreateRgn函数返回值传入各种形状区域 句柄,参数:参数类型及说明hWnd :将设置其区域的窗口的句柄。hRgn:设置好的区域的句柄,一旦设置了该 区域,就不能使用或修改该区域句柄,也不 要删除它bRedraw :是否立即重画窗口,若为TRUE, 则立即重画窗口注:为区域指定的所有坐标都以窗口坐标(和客户坐标不完全相同)表示,它们以整 个窗口(包括标题栏和边框,而客户坐标是 指不包括标题栏的窗口内部有效区域)的左 上角为起点椭圆CreateEllipticRgn函数:创建一个椭圆, 该椭圆以X1,

34、Y1和X2, Y2坐标点确定的 矩形内切。参数:X1,Y1:内切矩形左上角X,Y坐标X2,Y2:内切矩形右下角X,Y坐标得到屏幕有效区大小(除去任务条):SystemParametersInfoA声明:Private Type RECTLeft As Longtop As LongRight As LongBotton As LongEnd TypePrivate Declare Function SystemParametersInf oA Lib user32(ByVal uAction As Long, ByVal uParam As L ong, ByRef lpvparam _As

35、Any, ByVal fuWinIni As Long) As Long 调用如:将窗体移到屏幕有效区中央。Private Sub Command2_Click()Dim ScreenWidth&Dim ScreenHeight&Dim ScreenLeft&Dim ScreenTop&Dim DesktopArea As RECTConst SPI_GETWORKAREA = 48Call SystemParametersInfoA(SPI_GETWORKAREA, 0, DesktopArea, 0)ScreenHeight = (DesktopArea.Botton - Deskto p

36、Area.top) * Screen.TwipsPerPixelYScreenWidth = (DesktopArea.Right - DesktopArea.Left) * Screen.TwipsPerPixelXScreenLeft = DesktopArea.Left * Screen.Twip sPerPixelXScreenTop = DesktopArea.top * Screen.Twips PerPixelYForm1.Move (ScreenWidth - Form1.Width) / 2 + ScreenLeft, (ScreenHeight - Form1.He igh

37、t) / 2 + ScreenTopEnd SubSystemParametersInfoA函数可用来获取和 设置数量众多的windows系统参数。参数请查看资料。获得窗口在屏幕上的范围:GetWindowRect 函数包括窗口的边框,标题栏,滚动条及菜单,客户 区等在内,即整个窗口在屏幕上所占的范围. 声明:Declare Function GetWindowRect Lib user32(ByVal hwnd As Long, lpRect As RECT) A s Long第一个参数是窗口句柄,第二个参数装载窗口范围的坐标值,为一个结构类型,声明如下:Public Type RECTLe

38、ft As LongTop As LongRight As LongBottom As LongEnd Type该参数返回窗口在屏幕中的范围值,单位为象素。调用如:Private Sub Command1_Click()GetWindowRect Command1.hwnd, lxxPrint lxx.Left, lxx.Top, lxx.Right, lxx.BottomEnd Sub改变指定窗口的位置和大小:MoveWindow 函数相当于VB内置的Move方法,但作为API, 功能当然更强大,它可对任何非本进程的窗 口进行改变,声明:Declare Function MoveWindow

39、 Lib user32 (ByVal hwnd As Long, ByVal x As Long, By Val y As Long, ByVal nWidth As Long, ByV al nHeight As Long, ByVal bRepaint As Lon g) As Long第一个参数为要移动的窗口句柄,第二,三, 四,五个参数为窗口移动后的新横坐标,新 纵坐标,新宽度,新高度,第六个参数为是 否立即对窗口进行重画,用True或Falseo 调用如:MoveWindow Command1.hwnd, 0, 0, 100, 10 0, True因为改变的是对象在父窗口中的位置,所

40、以 Command1按纽被移到窗体Form1的客户区 左上角去了。判断屏幕上1指定点的客户区坐标:Screen ToClient 函数判断屏幕上某点相对于指定窗口内的坐标。 声明:Private Type POINTAPIx As Longy As LongEnd TypePrivate Declare Function ScreenToClient Lib user32 (ByVal hwnd As Long, lpPoint A s POINTAPI) As Long该函数用以测量点lpPoint在句柄为hwnd的 窗口内的坐标(如超越此窗口则为负数)。 调用如:Private Sub C

41、ommand1_Click()Dim lxn As POINTAPIlxn.x = 100: lxn.y = 100Call ScreenToClient(Form1.hwnd, lxn)Print lxn.x, lxn.yEnd Sub上例在调用前的lxn参数100,100是屏幕坐 标,调用函数后lxn的值是”屏幕坐标为(1 00,100)的点在form1中的客户坐标是多 少。如返回lxn.x=41,lxn.y=38,单位仍为象 素,不会变为form1内部的缇。获得窗口内以客户坐标表示的1个点的屏幕 坐标:ClientToScreen 函数该函数与上面那个正好相反。这里是已知客 户坐标求屏幕

42、坐标。注:客户坐标单位须先 转为象素。声明:Declare Function ClientToScreen Lib user32(ByVal hwnd As Long, lpPoint As POINTAPI) As Long参数hwnd:点所在的客户区窗口的句柄。参数lpPoint:传入点的客户区坐标(单位要 为象素),并返回点的屏幕坐标(象素)。调用如:Dim m As POINTAPIm.X = 50: m.Y = 70a = ClientToScreen(Form1.hwnd, m)Print m.X, m.Y该函数应用的是参数lpPoint返回值。=获得屏幕上某指定点所在的窗口的句柄

43、:WindowFromPoint 函数声明:Private Declare Function WindowFromPoint L ib user32 (ByVal xPoint As Long, ByVal yP oint As Long) As Long参数xPoint,yPoint是某点的屏幕坐标”。函 数返回值为包含该点的窗口句柄。调用如:Private Sub Command2_Click()Dim hwnd As Longhwnd = WindowFromPoint(1, 1)Print hwndEnd Sub上例表示屏幕上点(1,1)处在句柄为hwnd 的窗口内。此函数返回的句柄不

44、包含隐藏、屏蔽、透明 窗口的。如果要指出屏幕上某点所属的所有 窗口,就请用 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)坐标。以该 设备场景

45、的坐标系统来度量。调用如: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 L

46、ong调用如:Call EnableWindow(Form1.hwnd, 0) 为拒绝接受鼠标和键盘事件,调用如:Call EnableWindow(Form1.hwnd, 1) 为允许接受键盘和鼠标事件。参数:hwnd不用说,就是一个窗口句柄, fEnable参数:窗口是否响应操作。为零禁 止操作窗口,非零允许操作窗口。ShowWindow函数:显示或隐藏指定句柄的 窗口将1个隐藏的窗口显示出来,有意思,相当 于VB自身内部控件的visible属性。而且超 越于此,它还能指定显示时是否最大化,最 小化等,声明如下:Public Declare Function ShowWindow Lib

47、u ser32 (ByVal hwnd As Long, ByVal nCmdSh ow 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_R

48、ESTORE用原来的大小和位置显示一 个窗口,同时令其进入活动状态SW_SHOW=5用当前的大小和位置显示一 个窗口,同时令其进入活动状态SW_SHOWMAXIMIZED=3 最大化窗口,并 将其激活SW_SHOWMINIMIZED=2 最小化窗口,并 将其激活SW_SHOWDEFAULT=10按窗口本来的方 式显示,并激活。SW_SHOWMINNOACTIVE 最小化一个窗 口,同时不改变活动窗口SW_SHOWNA用当前的大小和位置显示一 个窗口,不改变活动窗口SW_SHOWNOACTIVATE用最近的大小和 位置显示一个窗口,同时不改变活动窗口 SW_SHOWNORMAL 与 SW_RES

49、TORE 相 同注:各常数的值请查阅 API浏览器中的 constants(常数列表)。关闭指定句柄的窗口:SendMessageA的WM_CLOSE 消息SendMessageA 的声 明在前面有,消息 WM_CLOSE的值为&H10,后两个参数为 空,用0&。函数返回值若为0表示程序处 理了此消息。调用如下:Private Declare Function SendMessage Lib u ser32 Alias SendMessageA (ByVal hwnd A s Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As A

50、ny) As Long Const WM_CLOSE = &H10Private 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 Fo

51、rm1.hwnd。寻找窗口列表中第一个符合条件的父窗 口: FindWindowA 函数Declare Function FindWindow Lib user32 A lias FindWindowA (ByVal lpClassName As String, ByVal lpWindowName As String) As L ong函数返回找到的窗口的句柄。比如要查找标 题为”未命名-记事本”的窗口句柄:hWndTmp = FindWindowA(vbNullString,未 命名-记事本”)二个参数均为字符串,如果 某个为空,则用vbNullString或0&补上。 参数:lpClas

52、sName:某窗口类名,或设为零 或 vbNullString,表示接收任何类 lpWindowName :某窗口标题,或设为零或 vbNullString,表示接收任何窗口标题。该函数常用来查找ThunderRTMain窗口类 的隐藏窗口的句柄。例如:Dim hw&, cnt&Dim rttitle As String * 256hw& = FindWindowA(ThunderRT5Main, v bNullString)cnt = GetWindowText(hw&, rttitle, 255) MsgBox Left$(rttitle, cnt), 0, RTMain title根据1

53、个窗口句柄返回另1个相关窗口句 柄:GetWindow 函数传入一个源窗口句柄,返回另1个与之有关 的窗口句柄,如源窗口的下1个兄弟窗口, 第1个子窗口等。声明:Declare Function GetWindow Lib user32(B yVal hwnd As Long, ByVal wCmd As Long) As Long 调用如:Const GW_HWNDNEXT = 2hWndlxn = GetWindow(hWndTmp, GW_HW NDNEXT)参数:hwnd:源窗口句柄。wCmd参数:指定结果窗口与源窗口的关系, 它们建立在下述常数基础上:GW_CHILD寻找源窗口的第一

54、个子窗口GW_HWNDFIRST为一个源子窗口寻找第 一个兄弟(同级)窗口,或寻找第一个顶级 窗口GW_HWNDLAST为一个源子窗口寻找最 后一个兄弟(同级)窗口,或寻找最后一个 顶级窗口GW_HWNDNEXT为源窗口寻找下一个兄 弟窗口GW_HWNDPREV为源窗口寻找前一个兄 弟窗口GW_OWNER寻找窗口的所有者 注解兄弟或同级是指在整个分级结构中位于同 一级别的窗口。如某个窗口有五个子窗口, 那五个窗口就是兄弟窗口。尽管GetWindow 可用于枚举窗口,但倘若要在枚举过程中重 新定位、创建和清除窗口,那么 EnumWindows 和 EnumChildWindows 更为 可靠。G

55、etWindowLongA函数:获得指定窗口某方 面的结构信息(返回长整数)。问题:什么叫”窗口的结构数据信息叩就是 1个窗口的诸方面情况吧,象人有姓名性别 年龄等一样,窗口有”扩展样式(包含标题 栏,如在Form1中表现为BorderStyle属性, 有标题栏缩小、无标题栏等的组合值),” 样式(包含滚动条、系统菜单、边框等可设 置)”,”父窗口”,”子窗口”,”窗口函数”等 诸多方面,见下面nIndex参数值。这些方面 的内容(每1方面只能有1个当前值)就构 成了窗口的结构信息。该函数从附加窗口内存中返回1个长整数 值。声明:Public Declare Function GetWindo

56、wLong Lib user32 Alias GetWindowLongA (ByVal h wnd As Long, ByVal nIndex As Long) As Lon g此函数用来获取指定窗口的某方面”结构数 据信息。函数返回值由参数nIndex来决定 要返回哪个方面的当前值。若出错则返回0。 调用如:Const GWL_STYLE = -16 Private Sub Command1_Click()X = GetWindowLongA(Form1.hwnd, GWL_S TYLE)Print XEnd Sub参数:hwnd: Long,欲获取信息的窗口的句柄 nIndex: Lon

57、g,欲取回此窗口哪方面的信息, 可以是下述任何一个常数:GWL_EXSTYLE扩展窗口样式(可 能 包 含 有:WS_EX_TOOLWINDOW=&H80 标题栏缩 小可变大小,相当于 BorderStyle=5; WS_EX_TRANSPARENT=& H20&隐藏绘图区,但显示其上的子控件。 有意思。等,别的我也不太清楚,好象要去 查MSDN才可查到)GWL_STYLE 窗 口样式(可能值有:WS_VSCROLL=?垂直滚动 条,WS_HSCROLL= ?水平滚动条, WS_MAXIMIZEBOX=?标题栏右边最大化 纽,WS_MINIMIZEBOX=?最小化纽等等) GWL_WNDPRO

58、C该窗口的窗口函数的位 置GWL_HINSTANCE拥有窗口的实例的句 柄GWL_HWNDPARENT该窗口之父的句柄。 不要用SetWindowWord来改变这个值 GWL_ID对话框中一个子窗口的标识符 GWL_USERDATA含义由应用程序规定 DWL_DLGPROC这个窗口的对话框函数位 置DWL_MSGRESULT在对话框函数中处理 的一条消息返回的值DWL_USER含义由应用程序规定SetWindowLongA函数:为窗口设置窗口结 构信息常用此函数来动态地设置窗口的风格(如样 式,滚动条等等)。即不在属性窗口中设置。 而在API中设置。声明:Public Declare Func

59、tion SetWindowLong Lib “user32 Alias SetWindowLongA (ByVal h wnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long 调用如:Public Const WS_EX_TOOLWINDOW = &H 80IStyle = WS_EX_TOOLWINDOWIRet = SetWindowLongA(Me.hwnd, GWL_E XSTYLE, GetWindowLongA(Me.hwnd, GW L_EXSTYLE) Or IStyle)注:这里有 1 个 Or

60、 或”操作。为何要用OR呢?这是因为一个窗 口的GWL_EXSTYLE包含了多项设置值的 和(如同时可能有滚动条,标题栏等值的组 合,如为262400),用or就可只改动其部分 值,而保留其他方面原设置不变。参数:hwnd Long,欲设置信息的窗口的句柄 nIndex Long,请参考 GetWindowLong 函数 的nIndex参数的说明dwNewLong Long,由 nIndex 指定的窗 口信 息的新值GetWindowWord函数:获得指定窗口的结构 信息(返回字值)该函数从附加窗口内存中返回字值。与GetWindowLong 相似。声明:Declare Function Ge

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论