我想做个小外挂,用api控制鼠标在游戏窗口上自动移动,这个我弄好了。但是当鼠标移动到一个物体时,比如移动到一棵树上,鼠标就变样子了,还有“树”的提示,我想问的就是我该如何判断鼠标变化了,或是如何取得这个“树”的提示,根据这个变化模拟鼠标点击呢?

解决方案 »

  1.   

    狂点的我有
    .form
    Option Explicit
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
    Dim NNum As Long
    Private Const WM_LBUTTONDOWN = &H201
    Private Const WM_LBUTTONUP = &H202
    Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
       
    Private Sub Form_Click()
        Unload Me
    End SubPrivate Sub Form_Load()
        Dim ret As Long
        preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
        ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf Wndproc)
        
        idHotKey = 1
        Modifiers = 0& 'MOD_CONTROL
        uVirtKey = vbKeySpace
        ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Dim ret As Long
        ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
        Call UnregisterHotKey(Me.hwnd, uVirtKey)
    End SubPrivate Sub Timer1_Timer()
        'On Error Resume Next
        Dim ret As Long
        
        ret = SendMessage(MouseDC.MDC, WM_LBUTTONDOWN, 0&, 0&)
        ret = SendMessage(MouseDC.MDC, WM_LBUTTONUP, 0&, 0&)
        ret = SendMessage(MouseDC.MDC, WM_LBUTTONDOWN, 0&, 0&)
        ret = SendMessage(MouseDC.MDC, WM_LBUTTONUP, 0&, 0&)End SubPrivate Sub Timer2_Timer()
        NNum = NNum + 1
        Dim ret As Long
        ret = Beep(45, 100)
        Timer1.Enabled = False
        Timer2.Enabled = False
    End Sub
      

  2.   

    Hook.Bas
    Option ExplicitDeclare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
    Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As LongPublic Const WM_HOTKEY = &H312
    Public Const MOD_ALT = &H1
    Public Const MOD_CONTROL = &H2
    Public Const MOD_SHIFT = &H4
    Public Const GWL_WNDPROC = (-4)Public preWinProc As Long
    Public Modifiers As Long, uVirtKey As Long, idHotKey As LongPrivate Type taLong
        ll As Long
    End TypePrivate Type t2Int
        lWord As Integer
        hWord As Integer
    End Type
    Dim iii
    Public Function Wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If Msg = WM_HOTKEY Then
            If wParam = idHotKey Then
                Dim lp As taLong, i2 As t2Int
                lp.ll = lParam
                LSet i2 = lp
                If (i2.lWord = Modifiers) And i2.hWord = uVirtKey Then
                    iii = iii + 1
                    If iii Mod 2 = 1 Then
                        
                        Form1.Timer1.Interval = 1000 / CLng(Form1.Text1.Text)
                        Form1.Timer1.Enabled = True
                        Form1.Timer2.Enabled = True
                    Else
                        Form1.Timer1.Enabled = False
                        Form1.Timer2.Enabled = False
                    End If
                    
                    
                    '******************
                End If
            End If
        End If
        Wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
     
    End Function
      

  3.   

    MouseDC.bas
    Option ExplicitPublic Declare Function WindowFromPoint Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
    Public Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
    Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPublic Type POINTAPI
        X As Long
        Y As Long
    End TypePublic Type DGfor3
        ponX As Long
        ponY As Long
        MDC As Long
    End TypePublic Function MouseDC() As DGfor3
        On Error Resume Next
        Dim Cur As POINTAPI
        GetCursorPos Cur
        MouseDC.MDC = WindowFromPoint(Cur.X, Cur.Y)
        MouseDC.ponX = Cur.X
        MouseDC.ponY = Cur.Y
    End Function
      

  4.   

    我怕这种方法行不通这种鼠标图标只是一个DirectDraw的Surface,真正的鼠标只是被隐藏起来了,而且它的Cursor应该不会变。