已有23人关注
[请教]关于屏幕取词
发表在VB答疑区 2010-06-07
是否精华
版块置顶:
正在学习VB范例完全自学手册.对第5章060实例比较感兴趣.
该范例只能对桌面的图片的名称进行取词,无法对文本文档,网页文字,Word文档,QQ聊天对话框等文本进行取词.
因为是自学,对API不太了解,
请教明日的老师们,要对其余的文本取词,应该如何修改代码,谢谢.
以下是关键代码片段:

Public Function MyHook(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    On Error GoTo 1
    Dim i As Long
    Dim pos As Long
    Dim carpos As Long
    Dim lc As Long
    If ncode = HC_ACTION Then
        hwd = GetFocus()                                             '获得拥有输入焦点的窗口的句柄
        If hwd <> Form1.hwnd Then
            GetWindowRect hwd, focus_rect                            '获得范围矩形
            GetCaretPos caret_pos                                    '判断插入符的当前位置
            Form1.Top = (focus_rect.Top + caret_pos.Y + 20) * Screen.TwipsPerPixelY
            Form1.Left = (focus_rect.Left + caret_pos.X + 10) * Screen.TwipsPerPixelX
            pos = caret_pos.X + caret_pos.Y * 65536
            carpos = SendMessage(hwd, EM_CHARFORMPOS, 0, ByVal pos)  '获取指定位置的字符串
            lc = carpos Mod 65536
            Form1.Text1.Text = GetWord(lc)
            If Form1.Caption <> GetWord(lc) Then
                Form1.Caption = GetWord(lc)
            End If
        End If
    Else
        CallNextHookEx haw, ncode, wParam, lParam                      '下一个钩子
    End If
    CallNextHookEx haw, ncode, wParam, lParam
1: End Function


Public Function GetWord(pos As Long) As String
    On Error Resume Next
    Dim pos1 As Integer, pos2 As Integer, i As Integer
    Dim strlen As Long
    Dim st() As Byte
    strlen = SendMessage(hwd, WM_GETTEXTLENGTH, 0, 0) + 1                   '获取字符串长度
    ReDim st(strlen) As Byte
    SendMessage hwd, WM_GETTEXT, strlen, st(0)
    pos1 = 0: pos2 = UBound(st)
    
    For i = pos - 1 To 0 Step -1                                            '向前搜索分格符的位置
        If IsDelimiter(st(i)) Then
            pos1 = i + 1
            Exit For
        End If
    Next
    For i = pos To UBound(st)                                               '向后搜寻分隔符字符的位置
        If IsDelimiter(st(i)) Then
            pos2 = i - 1
            Exit For
        End If
    Next
    
    If pos2 > pos1 Then                                                     '截取pos1-pos2之间的字符,以构成一个单词
        ReDim bArr2(pos2 - pos1) As Byte
        For i = pos1 To pos2
            bArr2(i - pos1) = st(i)
        Next
        GetWord = StrConv(bArr2, vbUnicode)
    Else
        GetWord = ""
    End If
End Function



非常感谢,!!!
分享到:
精彩评论 3
vb_music
学分:0 LV1
2010-06-08
沙发
你好:
    这个程序可以对这些图标的名称取词,你在仔细看一下,读一下书中的操作步骤;
    和关盘中的源代码!
qqwanjun
学分:0 LV1
TA的每日心情
奋斗
2023-04-16 10:40:35
2010-06-08
板凳
代码可以对桌面的图标取词,这个我知道
但是,无法对word text QQ等里面的文本取词

请教明日的老师修改代码。
vbsoldier
学分:0 LV1
2010-06-11
地板
回复:
  您好,这个程序只对能够被成功获取句柄的控件中的内容进行获取。目前使用VB6开发的此类程序也只能实现到这种程度了,毕竟VB没有VC那么强大。
首页上一页 1 下一页尾页 3 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照