我想实现类似金山词霸的屏幕取词功能,请教各位用什么API函数可以实现?最好给来个例子,谢谢

解决方案 »

  1.   

    阿门,api多了,还要api拦截呢……
      

  2.   

    很复杂,有delphi的例子,还是在本破书里的
      

  3.   

    牵扯的问题很多啊,以前的vb版的袁飞写过一个取词的东西.源代码可能还找得到.不过不是vb的
      

  4.   

    '模块文件:
    Option ExplicitPublic Const EM_CHARFROMPOS = &HD7
    Public Const EM_GETLINECOUNT = &HBA
    Public Const EM_GETLINE = &HC4
    Public Const EM_LINEINDEX = &HBB
    Public Const EM_LINELENGTH = &HC1
    Public Const EM_SETSEL = &HB1Declare Sub RtlMoveMemory Lib "KERNEL32" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    '给你整个frm文件:
    VERSION 5.00
    Begin VB.Form Form1 
       Caption         =   "读取鼠标所在位置的单词"
       ClientHeight    =   2955
       ClientLeft      =   60
       ClientTop       =   345
       ClientWidth     =   5160
       LinkTopic       =   "Form1"
       ScaleHeight     =   197
       ScaleMode       =   3  'Pixel
       ScaleWidth      =   344
       StartUpPosition =   3  '窗口缺省
       Begin VB.TextBox Text1 
          BeginProperty Font 
             Name            =   "MS Serif"
             Size            =   12
             Charset         =   0
             Weight          =   400
             Underline       =   0   'False
             Italic          =   0   'False
             Strikethrough   =   0   'False
          EndProperty
          Height          =   2535
          Left            =   240
          MultiLine       =   -1  'True
          ScrollBars      =   2  'Vertical
          TabIndex        =   0
          Text            =   "GetWord2.frx":0000
          Top             =   240
          Width           =   4695
       End
    End
    Attribute VB_Name = "Form1"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = True
    Attribute VB_Exposed = False
    Option ExplicitPrivate Sub Text1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Dim pos As Long, lc As Long
        Dim Line As Integer, CharPos As Integer
        
        pos = X / Screen.TwipsPerPixelX + Y / Screen.TwipsPerPixelY * 65536
        lc = SendMessage(Text1.hwnd, EM_CHARFROMPOS, 0, ByVal pos)
        
        Line = lc \ 65536
        CharPos = lc Mod 65536
        
        MsgBox " = " & GetLine(Text1, Line) & vbCrLf & "单词= " & GetWord(Text1, CharPos)
    End SubFunction GetWord(txt As TextBox, pos As Integer) As String
        Dim bArr() As Byte, pos1 As Integer, pos2 As Integer, i As Integer
        
        bArr = StrConv(txt.Text, vbFromUnicode)
        pos1 = 0: pos2 = UBound(bArr)
        
        For i = pos - 1 To 0 Step -1
            If IsDelimiter(bArr(i)) Then
                pos1 = i + 1
                Exit For
            End If
        Next
        
        For i = pos To UBound(bArr)
            If IsDelimiter(bArr(i)) Then
                pos2 = i - 1
                Exit For
            End If
        Next
        
        If pos2 > pos1 Then
            ReDim bArr2(pos2 - pos1) As Byte
            For i = pos1 To pos2
                bArr2(i - pos1) = bArr(i)
            Next
        
            GetWord = StrConv(bArr2, vbUnicode)
                    SendMessage txt.hwnd, EM_SETSEL, pos1, ByVal CLng(pos2 + 1)
        Else
            GetWord = ""
        End If
    End FunctionFunction IsDelimiter(ByVal Char As Byte) As Boolean
        Dim S As String
        
        S = Chr(Char)
        IsDelimiter = False
        If S = " " Or S = "," Or S = "." Or S = "?" Or S = vbCr Or S = vbLf Then
            IsDelimiter = True
        End If
    End FunctionFunction GetLine(txt As TextBox, ByVal Line As Integer) As String
        Dim S As String, Length As Integer, pos As Long
        
        GetLine = ""
        pos = SendMessage(txt.hwnd, EM_LINEINDEX, Line, ByVal 0&)
        Length = SendMessage(txt.hwnd, EM_LINELENGTH, pos, ByVal 0&)
        S = String(Length, Chr(0))
        RtlMoveMemory ByVal S, Length, 2
        If SendMessage(Text1.hwnd, EM_GETLINE, Line, ByVal S) > 0 Then
            GetLine = S
        End If
    End FunctionPrivate Sub Text1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Dim pos As Long, lc As Long
        Dim Line As Integer, CharPos As Integer
        
        pos = X / Screen.TwipsPerPixelX + Y / Screen.TwipsPerPixelY * 65536
        lc = SendMessage(Text1.hwnd, EM_CHARFROMPOS, 0, ByVal pos)
        
        Line = lc \ 65536
        CharPos = lc Mod 65536
        
        Text1.ToolTipText = GetWord(Text1, CharPos)
    End Sub