如何用VB获取屏幕信息

如何用VB获取屏幕信息,第1张

在有些软件里当鼠标移到某单词上,其注释就会显示单词的中文解释这样的软件是如何制作的呢下面我就介绍以下获取鼠标所在单词的方法,至于中文结实要关系到数据库及字库问题在此我不做解释

首先建立新工程,在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/ScreenTwipsPerPixelX

y=y/ScreenTwipsperPixelY

pos=x+y65536

Lc=SendMessage(Text1hwnd,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(txtText,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 pos2>pos1 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

在很多情况下捕捉屏幕上的画面是非常有用的,比如:记录电脑失灵或者写技术手册和软件文档。你可以运用两种方法从vb程序中捕捉屏幕。一种是复杂的方法,包含windows的设备描述表和API组件,还有一种简单的方法运用windows内置的屏幕捕捉能力。按下PrintScrn键将整个屏幕复制到剪贴板中,而[Alt]+[PrintScrn]键只能复制现用视窗。理论上,所有的vb程序都需要用到这个键。但是,你不能用SendKeys函数来完成这个功能。ByVal dwExtraInfo As Long) 下面是介绍如何将捕获的复制到剪贴板中,首先声明一个常量:Const VK_SNAPSHOT As Byte = &H2C然后使用下面的代码将现用视窗复制到剪贴板中:Call keybd_event(VK_SNAPSHOT, 0, 0, 0) 如果你想捕获整个屏幕,你可以这么做:Call keybd_event(VK_SNAPSHOT, 1, 0, 0)一旦屏幕的复制到了剪贴板中,你将会运用剪贴板的对象的GetData方法检索它。

<p>我也是个菜鸟,最近也在搞这个。</p><p>我一开始用你的思路写,可以实现。不过很多控件是不可以运行时候读取height和width的。会报错,然后单独考虑每一个控件,很麻烦。适用于控件不多的情况下。</p><p><br /></p><p>我觉得你应该换个思路,因为“程序的窗体和窗体内的控件太多”,换成vb自动运行时候自动更改屏幕分辨路,退出时候,还原电脑分辨率。</p><p><br /></p><p>我发给你个小程序,希望可以帮到你。</p><p>记得采纳建议噢。</p><file fsid="1462954612" link="/share/linkshareid=63333549&uk=738933636" name="修改分辨率zip" wealth="0" />

楼主说更改电脑的分辨率不可以,那我再提供了一个版本,软件适应不同分辨率。提供一个简单的例子。

我的qq:517177870

希望大家共同学习。

ScreenWidth 和 ScreenHeight 便是了

比如全屏:

from1Left = ScreenWidth

from1Top = ScreenHeight

或者在左下角显示气泡消息:

from1Left = ScreenWidth - 3810

from1Top = ScreenHeight - 450

楼主采纳哦

在 Timer1 事件中检测屏幕宽度或高度:

Private Sub Form_Load()

Timer1Enabled = True

Timer1Interval = 100

End Sub

Private Sub Timer1_Timer()

Static W As Long

If W > 0 And W <> ScreenWidth Then

MsgBox "屏幕分辨率已从 " & W / ScreenTwipsPerPixelX & " 变为 " & ScreenWidth / ScreenTwipsPerPixelX

End If

W = ScreenWidth

End Sub

我不是太明确你第一个问题的意思。我的理解是你要对屏幕的某个目标进行取色。问题是如何确认这个目标的位置。如果目标是固定的坐标或者在固定的屏幕比例中出现,那么直接针对的计算坐标来取色即可。但我想你希望的是对一个不固定的坐标取色。那么多半是窗口坐标,这样的话可以获取窗口的DC来取色。总的来说,你必须确立一个参照坐标。

2,出错是因为并不是所有DC都支持GetPixel 和 SetPixel。例如win7的很多窗体,Java程序的窗体。不过DirectX的窗体好像是可以的。因为这个原因,考虑到兼容性需要,我往往是使用BitBlt来对一个像素点截屏再进行取色。一般来说BitBlt 不会让效率降低太多。可能几十倍而已,几千几百个点的话可以忽略。如果你是对大范围取色,BitBlt会比GetPixel更有效率。

3读取jpg需要使用一些解码包会比较好,因为jpg的结构相当复杂,自己写代码会非常费事,事实上,我对JPG的结构还挺熟悉,但从来不敢想象自己写一个关于他的解压包。如果你是懒得找包的话,给你一个不太好的但可以处理的办法:使用JNI(Java native interface),他可以用作java 和c之间的界面, 由jdk自带。你可以在C里调度Java。java的 ImageIOread(File file);方程可以直接读取bmp gif jpg 和 png 文件。读出来的BufferedImage 可以直接获取像素资料,但是效率不高,你可以从BufferedImage对象中获取 WritableRaster,然后获取DataBuffer 最后是直接的 byte 或者 int 数组数据。但是,前提是你要会JNI,同时JNI在C中调度Java的代码也是非常糟糕的,代码效率还可以,但代码会极度难看。如果真的决定使用JNI,那我建议你先用Java写一个 byte[] readJPG(String path);的方程然后再C调度这个方程获取 byte 数组,而不是直接从C调用ImageIOread(),这样会省事非常多

但还是建议找C的解码包。给代码是不可能的,我原意话10分钟来回答问题,但不太原意话1小时来写代码。而且自己寻找答案会获得和学习更多。

最后如果你想要做的是图像识别,可以说jpg不是很好的选择,因为那是一种会丢失数据的文件格式,你用点对点的精确识别方法肯定(999999%)不能识别出。用模糊识别是要有很好的技术知识同时效率也会降低。建议使用BMP作为识别。BMP的解码包和源码网上一大堆。

以上就是关于如何用VB获取屏幕信息全部的内容,包括:如何用VB获取屏幕信息、如何在VB中执行屏幕捕捉、vb程序如何在不同电脑屏幕分辨率下的正常显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10147387.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存