vb一些的入门知识 

2006-12-12 11:47 发布

4520 7 0


以下是用VB做外挂的一些知识.我个人认为是入门的一些知识.不敢独享.贴出来给大家!~
有时间随时补充~呵呵
 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

楼主新帖

TA的作品 TA的主页
B Color Smilies

全部评论7

  • 暴米花
    暴米花 2006-12-12 11:47:00
    模拟键盘事件

    2.以下为模拟键盘事件.比如模拟"r"键.
    ----------------------------------------------------------------------------------------------------------------------------
     '在模块中定义 
        Public 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

  • 暴米花
    暴米花 2006-12-12 11:48:00
    快捷键例子

    3.以下为快捷键例子.比如按下"ctrl+A"就退出!
    '可以设置Form的KeyPreview属性为True,然后在Form_KeyDown事件中添加代码: 
        Private 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

  • 暴米花
    暴米花 2006-12-12 11:48:00
    控制鼠标的例子

    一些控制鼠标的例子! 
     1.模拟鼠标击键过程 
    '声明:
    Option Explicit
        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  )

    '对变量的定义
    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

     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
      4.移动鼠标到某某点
    移动鼠标.
    Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
    窗口函数如下:
    SetCursorPos 0, 0 '鼠标移动到0,0点
     5.鼠标坐标
    鼠标坐标.
    Type POINTAPI
        x As Long
        y As Long
    End Type
    Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    '鼠标坐标:
    在窗口中设立一记时器。一显示框。
            Dim z As POINTAPI 
            GetCursorPos z
            Label1.Caption = "x: " & z.x & " y: " & z.y '设定一个显示点label1.
     6.鼠标键数
    '鼠标键数.

    Public Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

    '鼠标键数
            Dim mousebtn As Long
            mousebtn = GetSystemMetrics(43)
            Label1.Caption = "你的鼠标是 " & mousebtn & " 键鼠标!" '设定一个显示点label1.

    以上也可以使用其他方式模拟.

  • 暴米花
    暴米花 2006-12-12 11:48: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,则立即重画窗口 
    注:为区域指定的所有坐标都以窗口坐标(和客户坐标不完全相同)表示,它们以整个窗口(包括标题栏和边框,而客户坐标是指不包括标题栏的窗口内部有效区域)的左上角为起点
    椭圆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 POINTAPI
    x As Long
    y As Long
    End Type
    Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
    该函数用以测量点lpPoint在句柄为hwnd的窗口内的坐标(如超越此窗口则为负数)。调用如:
    Private Sub Command1_Click()
    Dim lxn As POINTAPI
    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内部的缇。
    ===
    获得窗口内以客户坐标表示的1个点的屏幕坐标 : ClientToScreen函数
    该函数与上面那个正好相反。这里是已知客户坐标求屏幕坐标。注:客户坐标单位须先转为象素。
    声明:
    Declare Function ClientToScreen Lib "user32"(ByVal hwnd As Long, lpPoint As POINTAPI) As Long
    参数hwnd:点所在的客户区窗口的句柄。
    参数lpPoint:传入点的客户区坐标(单位要为象素),并返回点的屏幕坐标(象素)。
    调用如: 
    Dim m As POINTAPI
    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 用当前的大小和位置显示一个窗口,不改变活动窗口 
    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个长整数值。
    声明:
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    此函数用来获取指定窗口的某方面"结构数据"信息。 函数返回值由参数nIndex来决定要返回哪个方面的当前值。若出错则返回0。
    调用如:Const GWL_STYLE = -16
    Private Sub Command1_Click()
    X = GetWindowLongA(Form1.hwnd, GWL_STYLE)
    Print X
    End Sub
    参数:
    hwnd: Long,欲获取信息的窗口的句柄 
    nIndex: Long,欲取回此窗口哪方面的信息,可以是下述任何一个常数: 
    GWL_EXSTYLE 扩展窗口样式 
    (可能包含有:WS_EX_TOOLWINDOW=&H80标题栏缩小可变大小,相当于BorderStyle=5; WS_EX_TRANSPARENT=&H20&隐藏绘图区,但显示其上的子控件。有意思。等,别的我也不太清楚,好象要去查MSDN才可查到) 
    GWL_STYLE 窗口样式 
    (可能值有:WS_VSCROLL=?垂直滚动条,WS_HSCROLL=?水平滚动条,
    WS_MAXIMIZEBOX=?标题栏右边最大化纽,WS_MINIMIZEBOX=?最小化纽等等)
    GWL_WNDPROC 该窗口的窗口函数的地址 
    GWL_HINSTANCE 拥有窗口的实例的句柄 
    GWL_HWNDPARENT 该窗口之父的句柄。不要用SetWindowWord来改变这个值 
    GWL_ID 对话框中一个子窗口的标识符 
    GWL_USERDATA 含义由应用程序规定 
    DWL_DLGPROC 这个窗口的对话框函数地址 
    DWL_MSGRESULT 在对话框函数中处理的一条消息返回的值 
    DWL_USER 含义由应用程序规定 
    -----
    SetWindowLongA函数:为窗口设置窗口结构信息
    常用此函数来动态地设置窗口的风格(如样式,滚动条等等)。即不在属性窗口中设置。而在API中设置。 
    声明:
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    调用如:
    Public Const WS_EX_TOOLWINDOW = &H80
    lStyle = WS_EX_TOOLWINDOW
    lRet = SetWindowLongA(Me.hwnd, GWL_EXSTYLE, GetWindowLongA(Me.hwnd, GWL_EXSTYLE) Or lStyle) 注:这里有1个Or"或"操作。为何要用OR呢?这是因为一个窗口的GWL_EXSTYLE包含了多项设置值的和(如同时可能有滚动条,标题栏等值的组合,如为262400),用or就可只改动其部分值,而保留其他方面原设置不变。
    参数:
    hwnd Long,欲设置信息的窗口的句柄 
    nIndex Long,请参考GetWindowLong函数的nIndex参数的说明 
    dwNewLong Long,由nIndex指定的窗口信息的新值 
    -------
    GetWindowWord函数:获得指定窗口的结构信息(返回字值) 
    该函数从附加窗口内存中返回字值。与GetWindowLong相似。 
    声明: 
    Declare Function GetWindowWord Lib "user32" Alias "GetWindowWord" (ByVal hwnd As Long, ByVal nIndex As Long) As Integer
    调用如:
    Const GWL_HWNDPARENT = -8
    parent = GetWindowWord(Form1.hwnd, GWL_HWNDPARENT) 
    这里调用后parent返回Form1的上一级父窗口的句柄。再例如command1在form1中, x=GetWindowWord(command1.hwnd,GWL_HWNDPARENT)返回的x就等于form1.hwnd.
    参数见GetWindowLong.
    ======
    获得指定窗口所属的窗口类名称:GetClassNameA函数
    声明:
    Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
    调用如--求Form1所属的窗口类的名称 :
    pclass = Space(31) 
    nlen = GetClassNameA(form1.hwnd, pclass, 32)
    pclass = Left(pclass, nlen)
    第1个参数为某窗口句柄。第2个参数为字符串缓冲区,第3个参数为缓冲区长度。
    参数lpClassName返回值为窗口类名称字符串,如上例为ThunderFormDC类。
    函数返回值为类名字符串长度。如上面nlen为13。
    ====
    创建不规则窗口之"圆角矩形":SetWindowRgn结合CreateRoundRectRgn函数
    SetWindowRgn函数用于创建各种几何形状的窗口,声明前面已有,为:
    Public Declare Function SetWindowRgn Lib "user32" Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
    第1个参数为窗口句柄,第2个参数为几何形状区域句柄,第3个参数为是否立即重画。 
    函数CreateRoundRectRgn为创建圆角矩形,函数返回创建的圆角区域句柄。声明:
    Public Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
    参数就是三个(X,Y)值,X1,Y1为左上角坐标,因为是用窗口自身坐标系统来度量,所以左上角坐标一般为0,0(注:FORM窗体为scaleleft,scaletop),X2,Y2为右下角坐标(注意不一定是直接的width或scalewidth,要用scaleleft+scalewidth才是"右下角"横坐标):如果是控件,就是其width,height的值,而如果是窗体,要加上其scaleleft,scaletop
    得到右下角坐标值。X3,Y3表示圆角的大小。X3的取值范围是0(无圆角)到矩形宽(width或scalewidth,全圆),Y3的取值范围是0(无圆角)到矩形高(height或scaleheight,全圆),常乘以一个0至1的单精度数来表示。例如:
    x = SetWindowRgn(form1.hwnd, CreateRoundRectRgn(form1.ScaleLeft, form1.ScaleTop, form1.ScaleWidth + form1.ScaleLeft, form1.ScaleHeight + form1.ScaleTop, form1.ScaleWidth * 0.6, form1.ScaleHeight * 0.6), True)
    最后说明一下,还有一个API函数可直接画圆角矩形,就是RoundRect函数。声明:
    Declare Function RoundRect Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
    其中参数hDC是窗口的设备场景句柄。三个(X,Y)和CreateRoundRectRgn的是一样的,分别为左上角,右下角坐标和圆角大小。
    ======
    获取本程序活动窗口的句柄:GetActiveWindow函数
    声明:
    Declare Function GetActiveWindow Lib "user32"() As Long
    很简单,函数返回值为当前本程序活动窗口句柄。调用如:x=GetActiveWindow,这个函数不如GetForegroundWindow函数,建议用下面的:
    ----
    获取屏幕上当前活动窗口的句柄:GetForegroundWindow函数
    这个函数功能更强大,能获取前台应用程序的活动窗口句柄。声明:
    Declare Function GetForegroundWindow Lib "user32" () As Long
    函数返回值为当前屏幕上活动窗口的句柄,如:x=GetForegroundWindow。
    -----
    判断一个窗口是否是活动窗口:IsWindowEnabled函数
    声明:
    Declare Function IsWindowEnabled Lib "user32"(ByVal hwnd As Long) As Long 
    参数hwnd是待检测窗口句柄。
    调用如:x=IsWindowEnabled(Form1.hwnd),函数返回值若非0表示为活动窗口,返回0表示为失效窗口。
    ----
    禁止任务条--任务条所属窗口类为"Shell_traywnd",用FindWindowA函数去查,如下: TaskBarhWnd = FindWindowA("Shell_traywnd", ""),然后用EnableWindow函数: lxn = EnableWindow(TaskBarhWnd,0)就可以了。

  • 暴米花
    暴米花 2006-12-12 11:49:00
    取得窗口的句柄.类.名称等

     

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

    声明:
    Private Type POINTAPI
            x As Long
            y As Long
    End Type
    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) 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 POINTAPI
    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

  • 暴米花
    暴米花 2006-12-12 11:49:00
    制作自己的修改器.

    Option Explicit
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Const PROCESS_ALL_ACCESS = &H1F0FFF
    Private hProcess As Long
    '下面的函数用于查找游戏
    Function FindGame() As Boolean
    Dim PID As Long, Gamehwnd As Long
    FindGame = False
    Gamehwnd = FindWindow(vbNullString, "蜘蛛") '查找游戏的句柄
    If (Gamehwnd = 0) Then  '如果找不到(例如游戏未运行)就退出函数
    MsgBox "没有找到蜘蛛游戏"
    Exit Function
    End If
    GetWindowThreadProcessId Gamehwnd, PID '取得进程ID
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, PID) '以全部权力打开进程
    If (hProcess = 0) Then  '打开进程失败
    MsgBox "没有打开进程"
    Exit Function
    End If
    FindGame = True '成功!!
    End Function
    '回到VB的窗口设计模式,在窗体上放上两个按钮和一个文本框
    '一个按钮为"读取"一个为"写入",分别用于读取和写入数据
    '把Text1的Text设为空白
    Private Sub Command1_Click()
    Dim retV%, r&
    'Dim retV%, r&=Dim retV As Integer, r As Long
    If FindGame Then
    r = ReadProcessMemory(hProcess, &H1011F20, retV, 2, 0)  '这里重要,&H1011F20为内存地址.
    If r = 0 Then
    MsgBox "读取内存不成功!"
    Else
    Text1 = retV
    End If
    End If
    End Sub

    Private Sub Command2_Click()
    Dim r&
    If FindGame Then
    r = WriteProcessMemory(hProcess, &H1011F20, CInt(Val(Text1)), 2, 0)
    '参数与上面的基本相同
    'cInt(Val(Text1))是防止输入的过程有误,,例如,输入了字母,,如果不处理程序就会出错
    If r = 0 Then
    MsgBox "写内存不成功!"
    Else
    MsgBox "OK"
    End If
    End If
    End Sub

  • hing
    hing 2009-6-10 00:29:00

    回复: vb一些的入门知识

你可能喜欢

vb一些的入门知识 
联系
我们
快速回复 返回顶部 返回列表