此事件在移动鼠标时发生。语法Private Sub Form_MouseMove(button As Integer, shift As Integer, x As Single, y As Single)Private Sub MDIForm_MouseMove(button As Integer, shift As Integer, x As Single, y As Single)Private Sub object_MouseMove([index As Integer,] button As Integer, shift As Integer, x As Single, y As Single)MouseMove 事件语法包含下列部分:部分 描述 
object 一个对象表达式,其值是“应用于”列表中的一个对象。 
index 一个整数,用来唯一地标识一个在控件数组中的控件。 
button 一个整数,它对应鼠标各个按钮的状态,如果某个按钮按下,其中就有一个二进制位被设置。button 参数是具有相应于左按钮(位 0),右按钮(位 1),以及中间按钮(位 2)的一个位字段。这些位的值分别等于 1,2,和 4。它指示这些鼠标按钮的整体状态;三个二进制位中的一些、全部、或一个也没有被设置,指示这些按钮中的一些、全部、或一个也没有被按下。 
shift 一个整数,该整数相应于 SHIFT,CTRL,和 ALT 键的状态。某键被按下使得一个二进制位被设置。shift 参数是具有相应于 SHIFT 键(位 0),CTRL 键(位 1),以及 ALT 键(位 2)最少二进制位的一个位字段。这些位的值分别等于 1,2,和 4。shift 参数指示这些键的状态。这些位中可能有一些、全部、或者一个也没有被设置,指示这些键中的一些、全部、或者一个也没有被按下。例如,CTRL 和 ALT 键都被按下,则 shift 的值就是 6。 
x, y 一个指定鼠标指针当前位置的数。x 和 y 的值所表示的总是通过该对象 ScaleHeight, ScaleWidth, ScaleLeft,和 ScaleTop 属性所建立的坐标系统的方式。 
说明MouseMove 事件伴随鼠标指针在对象间移动时连续不断地产生。除非有另一个对象捕获了鼠标,否则,当鼠标位置在对象的边界范围内时该对象就能接收 MouseMove 事件。要测试 button 或 shift 参数,可使用对象浏览器中的 Visual Basic (VB) 对象库中所列出的常数,用来定义该参数中的各个位: 常数(按钮) 值 描述 
vbLeftButton 1 左按钮按下。 
vbRightButton 2 右按钮按下。 
vbMiddleButton 4 中间按钮按下。 常数(换挡) 值 描述 
vbShiftMask 1 SHIFT 键按下。 
vbCtrlMask 2 CTRL 键按下。 
vbAltMask 4 ALT 键按下。 
然后这些常数用作位屏蔽,对于按钮的各种组合,无须计算出各个组合的唯一的位字段值即可进行检测。要测试某一条件,首先将各个结果赋给一个临时整型变量然后再与一个位屏蔽的 button 或 shift 参数进行比较。测试应当用各个参数进行 And 运算,若结果大于零,则说明该键或按钮被按下。其操作如下:LeftDown = (Button And vbLeftButton) > 0
CtrlDown = (Shift And vbCtrlMask) > 0然后,接下去可对结果的各种组合进行检测,其操作如下:If LeftDown And CtrlDown Then注意 为了对鼠标按钮按下和释放所引起的事件进行处理,可使用 MouseDown 和 MouseUp 事件过程。MouseMove 事件的 button 参数与 MouseDown 和 MouseUp 事件的 button 参数是不同的。对于 MouseMove 事件来说,button 参数指示的是所有按钮当前的状态;一个 MouseMove 事件可指示某些、全部或没有一个按钮被按下。对于 MouseDown 和 MouseUp 事件来说,button 参数在每个事件精确地指示一个按钮。在 MouseMove 事件中任何时侯移动窗口,都能引起层叠事件。当该窗口移动到指针下面时 MouseMove 事件将产生。即使是鼠标完全不动 MouseMove 事件也能产生。

解决方案 »

  1.   

    简单方法就是用Timer事件+API函数GetCursorPos
      

  2.   

    第一步,调用GetCursorPos(ptCursor)得到鼠标位置
    第二步,调用hWndOver = WindowFromPoint(ptCursor)得到窗口句柄源代码见MSDN
    Q112649 HOWTO: Get a Window's Class Name and Other Window Attributes
      

  3.   

    mousemove
    在不同的控件的mousemove事件中用不同的鼠标指针。
      

  4.   

    各位兄弟可能没有明白我的意思,我不想用时间控件,因为会占用我的资源,而且也不是很准确,我不想在每一个控件中写代码,用为我的系统很大,可能一共有上万个控件。所以我想获取用户移动鼠标的事件,然后根据所指向的控件来显示不同的光标。再次谢谢各位的参与。祝大家新年愉快。在新的一年有很多的mm和MM。
      

  5.   

    用控件的MouseIcon和MousePointer属性!
      

  6.   

    如果是自己的系统直接用MouseIcon不就行了?
      

  7.   

    每个控件应该都会有自己的HWnd,并且都有一个Class,所有你可以先从光标所在的位置获得当前控件的Hwnd,然后通过HWnd得到控件的Class类别,通过对不同Class的判断就可以改变当前光标的形状。
      

  8.   

    API:SetCapture()
    全部事件送到Form中,在Form_MouseMove中测试,并且测试到超出Form的范围时ReleaseCapture()
      

  9.   

    挂一个Hook吧,idHook=WH_MOUSE,WM_MOUSEMOVE就干你想做的事情。
      

  10.   

    就是,写一个鼠标钩子,在消息过程中判断发生的事件,这时你可能不知道鼠标下是什么控件,可以用GetCursorPos 得到所指的点,然后用dongle说的就可以了.
      

  11.   

    建一个模块,加上:Public Function YourFunction(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    在form的load中加入“SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf YourFunction”,把你的YourFunction作为当前窗体的procedure,窗体的任何事件都会传向你的函数(注意:是任何事件,你建一个程序用F8单步执行一下就明白了,会陷入这个函数)。
    我新来的,如能解决你的问题,多给点分先,这里先谢过了:)
      

  12.   

    在Windows下面编程,几乎所有的控件都鼠标事件,可以在每个需要改变鼠标形状的控件上俘获鼠标移动消息,这也符合OOP思想,问题也就变得简单了
      

  13.   

    其实vb谢也可以就是马反
    我又vb的代码[email protected]
    vc
    dll
    // msghook.cpp : Defines the entry point for the DLL application.
    //
    #include "stdafx.h"
    #include "msghook.h"const MENU_ID=15;#pragma data_seg("Shared")
    HHOOK g_hook=NULL;
    HINSTANCE ghInstance=NULL;#pragma data_seg()
    #pragma comment(linker,"/section:Shared,rws")
    LRESULT CALLBACK  MsgProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    //这是就是拦住的消息,你想干啥都行
             return FALSE;
             
    }
    BOOL APIENTRY DllMain( HANDLE hModule, 
                           DWORD  ul_reason_for_call, 
                           LPVOID lpReserved
     )
    {
        switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    ghInstance=(HINSTANCE)hModule;
    break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
    break;
        }
        return TRUE;
    }void WINAPI HookStop()
    {
    ::UnhookWindowsHookEx(g_hook);
    }void WINAPI HookStart(HWND hWnd)
    {
    g_hook=::SetWindowsHookEx(WH_MOUSE,MsgProc,ghInstance,0);
    }
      

  14.   

    愚昧方法放个timer我想你已经明白了这个方法不好
    没准会被dr.ws给