位置容易拿到,事件只能写全局钩子了GetCursorPos VB声明 
Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long 
说明 
获取鼠标指针的当前位置 
返回值 
Long,非零表示成功,零表示失败。会设置GetLastError 
参数表 
参数 类型及说明 
lpPoint POINTAPI,随同指针在屏幕像素坐标中的位置载入的一个结构 

解决方案 »

  1.   

    使用鼠标的HOOK
    SetWindowsHookEx 函数
    WH_MOUSE
    WH_MOUSE_LL这两个事件是鼠标的事件
    详细内容你可以查看MSDN
      

  2.   

    Public Const WH_MOUSE = 7
    Public Const WH_MOUSE_LL = 14
    Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    'idHook参数代表拦截的类型,主要有键盘、鼠标等(当拦截键盘输入时值为2)
    'lpfn参数代表Hook函数的位址
    'hmod代表.dll的hInstance
    'dwThreadId代表执行拦截的ThreadId
    Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Sub EnableHook() '定义EnableHook
    '设置拦截
        hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf Myfunc, App.hInstance, 0)
    End Sub
    Sub DisableHook() '定义DisableHook
        Dim ret As Long
        ret = UnhookWindowsHookEx(hHook) '取消拦截
    End Sub
    Function Myfunc(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long 'wParam代表按键
        Form1.Text1 = wParam & "-" & lParam
        Myfunc = CallNextHookEx(hHook, ncode, wParam, lParam) '传到下一个拦截
    End Function下面是Form1的事件,注要有一个Text控件
    Private Sub Form_Load()
    Call EnableHook
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
    Call DisableHook
    End Sub
      

  3.   

    注意:第一段代码必须在模块里面
    欢迎访问我的小站
    http://lihuasoft.go163.net
      

  4.   

    要得到鼠标事件就要用钩子,而且是全程钩子,要得到鼠标坐标要用API:
    GetCursorPos(p as POINTAPI)
    钩子是你自己编写的程序代码!用来拦截系统的消息!
      

  5.   

    用API函数SetCapture实现。例:Form里放一个PictureBox控件,两个Command按钮。
    按下Command1时,用Picture1来捕捉鼠标事件,当鼠标
    移动时,动态显示按下位置的窗口ID及鼠标坐标;
    按下Command2时,恢复正常。Option ExplicitPrivate Declare Function SetCapture Lib "user32" ( _
        ByVal hwnd As Long) As Long
    Private Declare Function ReleaseCapture Lib "user32" () As Long
    Private Declare Function GetCursorPos Lib "user32" ( _
        lpPoint As POINTAPI) As Long
    Private Declare Function WindowFromPointXY Lib "user32" _
        Alias "WindowFromPoint" (ByVal xPoint As Long, _
        ByVal yPoint As Long) As LongPrivate Type POINTAPI
       X As Long
       Y As Long
    End TypePrivate m_Picking As BooleanPrivate Sub Command1_Click()
       m_Picking = True
       Call SetCapture(Picture1.hwnd)
    End SubPrivate Sub Command2_Click()
       m_Picking = False
       Call ReleaseCapture
    End SubPrivate Sub Picture1_MouseDown(Button As Integer, _
       Shift As Integer, X As Single, Y As Single)
        '自己的处理程序
    End SubPrivate Sub Picture1_MouseUp(Button As Integer, _
       Shift As Integer, X As Single, Y As Single)
        '自己的处理程序
    End SubPrivate Sub Picture1_MouseMove(Button As Integer, _
       Shift As Integer, X As Single, Y As Single)
        Dim pt As POINTAPI
        Dim hwnd As Long
        If m_Picking Then
            Call GetCursorPos(pt)
            hwnd = WindowFromPointXY(pt.X, pt.Y)
            Me.Caption = Hex(hWnd) & " -- " & pt.X & "," & pt.Y
        End If
    End Sub
      

  6.   

    好像用钩子,得到的不是像素点位置嘛,和from的left,top对不上啊!
      

  7.   

    用google搜一下,应该可以找到的.
      

  8.   

    将MyFunc中的内容改为下面内容,即可收到鼠标指针,其中要声明CopyMemory 这个API函数,鼠标指针是以像素为单位的,你可以转成VB的缇,方法是pt.X * Screen.TwipsPerPixelX和 pt.Y * Screen.TwipsPerPixelX,这个值和VB中窗体的left是一样的。
    Dim kk As mPoint ' tagKBDLLHOOKSTRUCT
    Dim kb As Long, pks As Byte
    Dim pt As tarPoint
        'Debug.Print wParam
        CopyMemory kk, ByVal lParam, Len(kk)
        CopyMemory pt, ByVal VarPtr(kk.pt), Len(pt)
        Form1.Text1 = wParam & ";X=" & pt.X & ";Y=" & pt.Y
    Myfunc = CallNextHookEx(hHook, ncode, wParam, lParam) '传到下一个拦截
      

  9.   

    不用写Hook,只要先SetCapture锁住鼠标事件就行,想知位置用GetCursorPos,释放事件用ReleaseCapture。
    函数的使用见FreshAir(FreshAir)的内容