好像按键精灵有一个GetCursorShape()函数可以获取特征码,不知道VB6能不能实现类似的功能?
附注:
1 最好是机器无关的,不是也可以。
2 特征码就是一串数字,用来区分不同的鼠标形状。
3 获取鼠标形状的位图的操作已经实现,现在就是如何通过这个位图来获取特征码。
4 目前我的实现方法是将位图的Byte数组转换为二进制,然后获取1和0的个数,最后相加获得特征码,有没有比这种方式更好的方法呢?若能提供帮助,小弟我感激不尽。
vbbyteGetCursorShape

解决方案 »

  1.   

    MousePointer 属性
          返回或设置一个值,该值指示在运行时当鼠标移动到对象的一个特定部分时,被显示的鼠标指针的类型。语法object.MousePointer [= value]MousePointer 属性语法包含下面部分:部分 描述 
    object 对象表达式,其值是“应用于”列表中的一个对象。 
    value 整数,按照设置值中的描述指定被显示的鼠标指针类型。 
    设置值value 的设置值为:常数 值 描述 
    vbDefault 0 (缺省值)形状由对象决定。 
    VbArrow 1 箭头。 
    VbCrosshair 2 十字线(crosshair 指针)。 
    VbIbeam 3 I 型 
    VbIconPointer 4 图标(矩形内的小矩形)。 
    VbSizePointer 5 尺寸线(指向东、南、西和北四方向的箭头)。 
    VbSizeNESW 6 右上-左下尺寸线(指向东北和西南方向的双箭头)。 
    VbSizeNS 7 垂-直尺寸线(指向南和北的双箭头)。 
    VbSizeNWSE 8 左上-右下尺寸线(指向东南和西北方向的双箭头)。 
    VbSizeWE 9 水-平尺寸线(指向东和西两个方向的双箭头)。 
    VbUpArrow 10 向上的箭头。 
    VbHourglass 11 沙漏(表示等待状态)。 
    VbNoDrop 12 不允许放下。 
    VbArrowHourglass 13 箭头和沙漏。 
    VbArrowQuestion 14 箭头和问号。 
    VbSizeAll 15 四向尺寸线。 
    VbCustom 99 通过 MouseIcon 属性所指定的自定义图标。 
    说明在鼠标指针越过窗体或对话框上的控件时,为了指出功能上的改变,可以使用该属性。沙漏标形状设置值 (11) 是很有用的,用来指示用户需要等待过程或操作的完成。注意 如果应用程序调用 DoEvents,那么 MousePointer 属性在经过 ActiveX 部件时可能暂时地改变。
      

  2.   

    Option ExplicitPrivate Sub Command1_Click()
        Me.MousePointer = vbUpArrow   '向上的箭头
        Debug.Print Me.MousePointer
    End Sub
      

  3.   

    这个形状是自行设置的,你只需将MousePointer设置为99,然后就可以修改:MouseIcon属性为你想要的图片即可。
      

  4.   

    用GetCursor API获取指针句柄。
    准备一个DC,用DrawIcon API画上去。
    至于怎么获得形状,就是你的事情了。
      

  5.   

    调用GetCursorInfo,然后得到的结构中hCursor就是你要的东西.
      

  6.   

    Public Function GetCursorShape() As Long
        Dim Pt As POINTAPI
        Call GetCursorPos(Pt)
        
        Dim hWindow As Long
        hWindow = WindowFromPoint(Pt.x, Pt.y)
        
        Dim name As String * 256
        Call GetWindowText(hWindow, name, 256)
        
        Dim dwThreadID As Long
        dwThreadID = GetWindowThreadProcessId(hWindow, 0)
        
        Dim dwCurrentThreadID As Long
        dwCurrentThreadID = GetCurrentThreadId
        
        Dim hc As Long
        If dwCurrentThreadID <> dwThreadID Then
            If AttachThreadInput(dwCurrentThreadID, dwThreadID, True) Then
                hc = GetCursor
                Call AttachThreadInput(dwCurrentThreadID, dwThreadID, False)
            End If
        Else
            hc = GetCursor
        End If
        
        Dim ii As ICONINFO
        Call GetIconInfo(hc, ii)
        
        Dim L As Long
        L = 1024
        
        Static bytes() As Byte
        ReDim bytes(1 To L)
        
        Dim length As Long
        length = GetBitmapBits(ii.hbmColor, L, bytes(1))
        
        Debug.Assert length < L
        
        Dim arr(0 To 1) As Long
        Dim i As Long
        For i = LBound(arr) To UBound(arr)
            arr(i) = 0
        Next
        
        For i = 1 To length
            Dim j As Long
            j = bytes(i)
            
            Dim m As Long
            For m = 1 To 8
                Dim k As Long
                k = j Mod 2
                
                arr(k) = arr(k) + 1
                j = j \ 2
            Next
        Next
        
        Dim result As String
        result = ""
        
        For i = LBound(arr) To UBound(arr)
            result = result & arr(i)
        Next
        
        Debug.Print Pt.x, Pt.y, result, Now, name
        GetCursorShape = CLng(result)
    End Function
    这是我获取鼠标形状的代码,其中hc就是HCURSOR,这样获得的hc和GetCursorInfo获得的hc应该一样吧?我跟踪过,发现每次程序启动后这个hc都不一样。。
      

  7.   

    肯定是不一样的,每个程序启动时加载光标的句柄都是动态的.你如果想进行基于光标本身的判断,那就要多做一步,即保存每个取得的光标图像指纹(可以用哈希或CRC),然后在获取到下一个光标图像时进行对比,如果相同的话就判断为同一个光标图像,再给出同样的编号或索引.系统并没有对应用程序自己的光标有编制(除了系统自带的外),因为别的应用程序要加载的光标根本是未知的,所以你要自己去维护一个列表,所有出现过的就给出列表中的索引,没出现过的就新建一个索引并加进去.