扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
如果你装了金山词霸,可以这样
让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:主机域名、虚拟空间、营销软件、网站建设、任县网站维护、网站推广。
从“引用”中添加XdictGrb.dll
Option Explicit
Implements IXDictGrabSink
Private gp As GrabProxyPrivate Sub Form_Load()
Set gp = New GrabProxy
With gp
.GrabEnabled = True '是否有效
.GrabInterval = 30 '指定抓取时间间隔
.GrabMode = XDictGrabMouse '模式(鼠标是否加按键)
.AdviseGrab Me '接口指向自身End WithEnd SubPrivate Sub Form_Unload(Cancel As Integer)
Set gp = Nothing
End Sub
Private Function IXDictGrabSink_QueryWord(ByVal WordString As String, ByVal lCursorX As Long, ByVal lCursorY As Long, ByVal SentenceString As String, lLoc As Long, lStart As Long) As Long
Label1.Caption = "当前坐标:" "(" lCursorX "," lCursorY ")"
Label2.Caption = "当前语句:" SentenceString
Label3.Caption = "当前字符:" Mid(SentenceString, lLoc + 1, 1000)
End Function
在有些软件里当鼠标移到某单词上,其注释就会显示单词的中文解释.这样的软件是如何制作的呢?下面我就介绍以下获取鼠标所在单词的方法,至于中文结实要关系到数据库及字库问题在此我不做解释.
首先建立新工程,在FORM上添加一个TEXT文本框.
声明SendMessage函数.
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const EM_CHARFORMPOS=HD7注释:在API浏览器里无此值请自己加上.
自定义过程:
Private Sub Text1_MouseDown(Button As Intege,Shift As Integer,x As Single, y As Single)
注释:获取鼠标所点的是第几行第几个字符
Dim pos As Long,Lc As Long
Dim Line As Integer,CharPos As Integer
x=x/Screen.TwipsPerPixelX
y=y/Screen.TwipsperPixelY
pos=x+y*65536
Lc=SendMessage(Text1.hwnd,EM_CHARFROMPOS,0,ByVal pos)
Line=Lc65536 注释:第几行
CharPos=Lc MOD 65536 注释:第几个字符
End Sub
注释:接下来才是真正的读取函数
Function 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)注释:转换成Byte数组
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
注释:截取pos1-pos2之间的字符,以构成一个单词
If pos2pos1 Then
ReDim bArr2(pos2-pos1) As Byte
For i=pos1 To Pos2
bArr2(i-pos1)=bArr(i)
Next
GetWord=StrConv(bArr2,vbUnicode)
Else
GetWord=""
End If
End Function
注释:IsDelimiter函数
Functon 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 Function
用API函数GetWindowText。
GetWindowText
VB声明
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
说明
取得一个窗体的标题文字,或者一个控件的内容
返回值:Long,复制到lpString的字串长度;不包括空中止字符。会设置GetLastError
参数表
hwnd: Long,欲获取文字的那个窗口的句柄
lpString: String,预定义的一个缓冲区,至少有cch+1个字符大小;随同窗口文字载入
cch: Long,lpString缓冲区的长度
注解
不能用它从另一个应用程序的编辑控件中获取文字
我要补充以下,如果不知道句柄,那么可以用For计数循环进行穷举。
1.随机产生英文字母
Randomize() '功 能:初始化随机数发生器
Me.txt1.Text = Chr(Asc("a") + Int(Rnd() * 26))
'Rnd 函数返回小于 1 但大于或等于 0 的值。
'0 = Rnd() * 26 26 是含小数位的数
'Int(Rnd() * 26) 转换为整型,就是0~25的随机数
'Asc("a") 得到a的ASCii数值,是整数97(A是65)
'a~z的ASCii为97~122 ,即为a~z之间的字母为97加(0~25)
'Asc("a") + Int(Rnd() * 26)为97到122的随机数
'Chr()又可以起到转换成字符的功能,Chr(97)表示a (a转换成数值又是Asc("a")=97)
'Chr(Asc("a") + Int(Rnd() * 26))就是a~z的随机数了
Randomize() '再次初始化随机数发生器
Me.txt2.Text = Chr(Asc("A") + Int(Rnd() * 26)) '这里是A~Z的随机数
'也可以换这种写法
Randomize()
Me.txt1.Text = Chr(Int((26 * Rnd()) + 97)) '这里是a~z的随机数
'这是在你知道ASCII码的情况之下(a~z为97~122,A~Z为65~90)
'Rnd()为0~0.9999999.....的随机数
' 26 * Rnd()为0~25.9999...的随机数
'Int((26 * Rnd())为0~25的随机数
'Int((26 * Rnd()) + 97)为97~122的随机数
'Chr(Int((26 * Rnd()) + 97))就是a~z的随机数了
Randomize()
Me.txt2.Text = Chr(Int((26 * Rnd()) + 65)) '这里是A~Z的随机数
'至于同时在一处随机大写或小写,ASCII码的数字又不挨在一起(65-90,97-122),比较麻烦。想写的话,你可以自己想一下怎么办
2.数字怎样转换成ASCII码所对应的字母
Chr()函数将数字转换成ASCII对应的字母,Asc()函数将字母根据ASCII表转换成数字
Chr(97)表示a (a转换成数值又是Asc("a")=97)
3.加到数组,你可以放在一个for循环里
比如
Dim arylst1 As New ArrayList
Dim arr1() As String '数组
Dim str1 As String
For i As Integer = 1 To 15 '比如我想要15个随机字母
Randomize()
str1 = Chr(Int((26 * Rnd()) + 65)) '这里是A~Z的随机数
arylst1.Add(str1)
Next
ReDim arr1(arylst1.Count - 1) '这里是为了比较动态,可以只改变 i 的范围来决定要多少个随机字母
'当然也可以写死,在前面直接定义为 arr1(14),下次要改的时候就要改定义的地方和i的范围,改两个地方
arylst1.CopyTo(arr1)
'就把数值拷贝到数组里面了
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流