VB关于GetPixel取色的问题

GetPixel能做到对其他窗口后台取色吗?hwnd是一个网页的句柄hScreen=GetDC(hwnd)GetColor=GetPixel(hScreen,368,23... GetPixel能做到对其他窗口后台取色吗?
hwnd是一个网页的句柄
hScreen = GetDC(hwnd)
GetColor = GetPixel(hScreen, 368, 237)
Label1.Caption = GetColor
获取到的颜色值竟然是 -1
是哪里错了吗?还是漏掉了什么?高手们能教我一下吗?

hwnd为0的时候能正常在屏幕上获取颜色
可是我想后台获取颜色,就是可以在目标窗口被遮挡的情况下也能获取
希望高手能帮我写出来一下,万分感谢~~~
要能后台取色,就是该点被遮挡时也能正常取到指定窗口的色
我按照下面说的试了一下...
Dim P As POINTAPI, h As Long, hD As Long, c As Long
P.x = 368: P.y = 237
h = 6555184
hD = GetDC(h)
ScreenToClient h, P
c = GetPixel(hD, P.x, P.y)
Command1.Caption = Hex(c)

基本意思是按照你说的做的,可是目标窗口被遮挡时,取值依旧是 -1
这样还不如直接用GetDC(0)做前台取色.........

希望老大们给个能实现被遮挡也能取到色的代码?万分感谢了
展开
 我来答
useforprogram
2010-05-24 · TA获得超过114个赞
知道答主
回答量:151
采纳率:0%
帮助的人:109万
展开全部
说明一下,getpixel函数对指定点取色的用法,hdc和point要在同一场景里,你取到-1的可能性是point的坐标和hdc不配套.GetCursorPos得到的是屏幕坐标,把它用ScreenToClient函数转换一下,换到相应的场景中再取色.

应楼主要求写一段实现代码上来,新建一个"标准EXE"工程,添加一个PICTUREBOX,一个TIMER,把TIMER的INTERVAL改成100左右,改FORM1的SCALEMODE为3,打开FORM1的代码窗口,粘贴以下代码:

Option Explicit

Private Type POINTAPI
x As Long
y As Long
End Type

Private Declare Function GetDC Lib "user32" ( _
ByVal hwnd As Long) As Long

Private Declare Function GetPixel Lib "gdi32" ( _
ByVal hdc As Long, _
ByVal x As Long, _
ByVal y As Long) As Long

Private Declare Function ScreenToClient Lib "user32" ( _
ByVal hwnd As Long, _
lpPoint As POINTAPI) As Long

Private Declare Function GetCursorPos Lib "user32" ( _
lpPoint As POINTAPI) As Long

Private Declare Function WindowFromPoint Lib "user32" ( _
ByVal xPoint As Long, _
ByVal yPoint As Long) As Long

Private Declare Function BitBlt Lib "gdi32" ( _
ByVal hDestDC As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal dwRop As Long) As Long

Private Sub Timer1_Timer()
Dim NewPos As POINTAPI
GetCursorPos NewPos
Dim lngHwnd As Long
lngHwnd = WindowFromPoint(NewPos.x, NewPos.y)
Static lngOldX As Long, lngOldY As Long
On Local Error Resume Next
If NewPos.x = lngOldX And NewPos.y = lngOldY Then Exit Sub
lngOldX = NewPos.x: lngOldY = NewPos.y
Dim lngDC As Long
lngDC = GetDC(lngHwnd)
ScreenToClient lngHwnd, NewPos
Dim lngColor As Long
lngColor = GetPixel(lngDC, NewPos.x, NewPos.y)
If lngColor = -1 Then
BitBlt Picture1.hdc, 0, 0, 1, 1, lngDC, NewPos.x, NewPos.y, vbSrcCopy
lngColor = Picture1.Point(0, 0)
Else
Picture1.PSet (0, 0), lngColor
End If
Picture1.BackColor = lngColor
End Sub

实现每200毫秒左右根据鼠标所在位置变化PICTUREBOX颜色.
huodeming
2010-05-21 · TA获得超过265个赞
知道小有建树答主
回答量:500
采纳率:25%
帮助的人:200万
展开全部
VB声明
Declare Function GetPixel Lib "gdi32" Alias "GetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
说明
在指定的设备场景中取得一个像素的RGB值
返回值
Long,指定点的RGB颜色。如指定的点位于设备场景的剪切区之外,则返回CLR_INVALID
参数表
参数 类型及说明
hdc Long,一个设备场景的句柄
x,y Long,逻辑坐标中要检查的点
注解
用GetDeviceCaps判断设备是否支持本函数

你写的代码好像没错,是不是你坐标的问题???改个坐标试下
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bater2000
2010-05-21 · TA获得超过1486个赞
知道小有建树答主
回答量:803
采纳率:0%
帮助的人:1078万
展开全部
GetPixel可以从后台获取颜色,只要给其指定正确的hwnd窗体句柄即可。

颜色值是-1时表示取色失败,问题出在网页句柄hwnd,估计传错了句柄。你用WindowFromPoint这个API函数可以获取鼠标坐标所在位置的hwnd句柄,它获取的句柄绝对正确。你既可以用它检测你hwnd获取的结果是否正确,也可以把它作为你程序的hwnd来获取窗体的hDC。

你发上来的程序貌似没有问题,只要记得hwnd hDC 和获取的颜色数值类型都应是长整型Long即可。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式