请问如何获取鼠标形状的特征码呀?

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

若能提供帮助,小弟我感激不尽。
...全文
1903 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq759988939 2013-07-16
  • 打赏
  • 举报
回复
@myjian 佩服你,你是高手
milaoshu1020 2013-03-11
  • 打赏
  • 举报
回复
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都不一样。。
嗷嗷叫的老马 2013-03-11
  • 打赏
  • 举报
回复
肯定是不一样的,每个程序启动时加载光标的句柄都是动态的. 你如果想进行基于光标本身的判断,那就要多做一步,即保存每个取得的光标图像指纹(可以用哈希或CRC),然后在获取到下一个光标图像时进行对比,如果相同的话就判断为同一个光标图像,再给出同样的编号或索引. 系统并没有对应用程序自己的光标有编制(除了系统自带的外),因为别的应用程序要加载的光标根本是未知的,所以你要自己去维护一个列表,所有出现过的就给出列表中的索引,没出现过的就新建一个索引并加进去.
嗷嗷叫的老马 2013-03-10
  • 打赏
  • 举报
回复
调用GetCursorInfo,然后得到的结构中hCursor就是你要的东西.
milaoshu1020 2013-03-09
  • 打赏
  • 举报
回复
引用 7 楼 caozhy 的回复:
是啊,我知道啊。
threenewbee 2013-03-09
  • 打赏
  • 举报
回复
引用 6 楼 milaoshu1020 的回复:
引用 5 楼 caozhy 的回复:用GetCursor API获取指针句柄。 准备一个DC,用DrawIcon API画上去。 至于怎么获得形状,就是你的事情了。 不好意思,我问的就是怎么获取形状的特征码。。。
是啊,我知道啊。
milaoshu1020 2013-03-09
  • 打赏
  • 举报
回复
引用 5 楼 caozhy 的回复:
用GetCursor API获取指针句柄。 准备一个DC,用DrawIcon API画上去。 至于怎么获得形状,就是你的事情了。
不好意思,我问的就是怎么获取形状的特征码。。。
threenewbee 2013-03-06
  • 打赏
  • 举报
回复
用GetCursor API获取指针句柄。 准备一个DC,用DrawIcon API画上去。 至于怎么获得形状,就是你的事情了。
贝隆 2013-03-06
  • 打赏
  • 举报
回复
这个形状是自行设置的,你只需将MousePointer设置为99,然后就可以修改:MouseIcon属性为你想要的图片即可。
milaoshu1020 2013-03-06
  • 打赏
  • 举报
回复
谢谢你的回答,但我想得到的鼠标形状并不是系统内置的形状。 比如魔兽世界的鼠标形状是个手形状的图标,而且会根据指向的对象而有所变化。
贝隆 2013-03-04
  • 打赏
  • 举报
回复
Option Explicit

Private Sub Command1_Click()
    Me.MousePointer = vbUpArrow   '向上的箭头
    Debug.Print Me.MousePointer
End Sub
贝隆 2013-03-04
  • 打赏
  • 举报
回复
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 部件时可能暂时地改变。
特征工程是什么?】 身高不同的两人,比较体重毫无意义, 但是如果将身高体重加以计算,转化成了BMI指数:BMI=体重/(身高^2) 通过比较这个新创造的特征值,谁胖谁瘦就一目了然了。 这就是特征工程,将原始数据转换为可以更好的、代表预测模型潜在问题的特征,通过分析这个新的特征,可以得到更准确的预测结果。 【特征工程——Python数据分析必备】 脏数据的“清洗剂” 有人说:学会了Python语言,就会做数据分析? 不一定! 你拿到的数据样本集,有可能存在这些问题: 如果样本数据存在问题,对数据建模的执行效率会有很大影响,甚至可能会造成模型结果的偏差。 不懂特征工程,数据分析=白忙一场! 【站内首门!特征工程全解课程】 过去,数字化是企业优化的要点; 而今,数字化成为了企业活下去的关键。 而数据分析应用有多广,特征工程的学习需求就有多大。 不过,大部分课本对于特征工程这一知识点鲜有提及,市面上的课程也少之又少,导致很多人在实际工作或学习中,遇到问题束手无策,严重降低效率。 CSDN全站首发——Python数据处理与特征工程 课程聚焦数据科学中,数据清洗与分析前的特征提取过程,解决数据科学中最重要的原始数据清洗和特征提取。 【定制课程 精准扫除学习盲点】 课程充分考虑各类实际问题,将每个知识点融入到对应的代实例中,初学者也可无压力上手,讲师手把手带领入门。 知识点扫盲 + 案例实践 + 线上答疑 扫清数据分析前的所有障碍,提升你的数据工作的效率与准确度。 如果你是: 在这里你可以收获...... 了解如何将各类型数据载入计算机,进而愉快的探索数据科学; 掌握如何将需要分析的数据转化为算法模型可以接受的格式; 学会特征提取最基本的处理方式,为后续的算法学习打好基础。 经过19节课程的学习,你可以基本掌握数据采集、读取以及清洗的方法,具备进一步学习数据分析乃至深度学习的能力,能够大大拓宽你日后的求职道路。 【三重福利  惊喜等你】

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧