请问如何用API函数实现截图功能?

时间:2021-02-23 15:24:51
比如一个实时变化的图片,用VB实现在后台实时截图的功能。应该怎么实现啊?

21 个解决方案

#1


屏幕抓图软件的源程序(Delphi4.0 1.0.0.0版的源程序)
可以定时抓图片

#2


如果是全屏幕的话,这样最方便
把他加在定时器在修改相关的保存语句就可以了
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const theScreen = 1
Const theForm = 0
Private Sub Command1_Click()
Call keybd_event(vbKeySnapshot, theForm, 0, 0)
'若theForm改成theScreen则Copy整个Screen
DoEvents
Picture1.Picture = Clipboard.GetData(vbCFBitmap)
End Sub

#3


看看鄙人这篇文章:
http://blog.csdn.net/xinliangyu/archive/2005/01/31/Save_screen_image_to_a_File_in_VB_propramming.aspx
其下的函数hDCToPicture 变是变指定DC对象上任意矩形区域图形转换成stdPicture对象,该对象可以用savepicture方法保存为图像文件

#4


可是不是截屏幕 是截某一个实时变化的窗口啊

#5


截图的代码好多啊..呵呵,我就收信了两种方式!!(+ laviewpbt)的是第三种了!

Option Explicit

Private Type POINTAPI
    x As Long
    y As Long
End Type
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 Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function GetCursor Lib "user32" () As Long

Private Sub Command1_Click()
    Dim hdc As Long, nWidth As Integer, nHeight As Integer, nScreenWidth As Integer, nScreenHeight As Integer
    Dim CurPos As POINTAPI
    Dim Cur As Long
    Me.Hide
    DoEvents
    Picture1.AutoRedraw = True
    hdc = GetDC(0)
    nScreenWidth = Screen.Width
    nScreenHeight = Screen.Height
    Picture1.Width = nScreenWidth
    Picture1.Height = nScreenHeight
    nWidth = nScreenWidth / Screen.TwipsPerPixelX
    nHeight = nScreenHeight / Screen.TwipsPerPixelY
    BitBlt Picture1.hdc, 0, 0, nWidth, nHeight, hdc, 0, 0, vbSrcCopy
    Me.Show
    GetCursorPos CurPos
    Cur = GetCursor
    DrawIcon Picture1.hdc, CurPos.x - 10, CurPos.y - 10, Cur
    ReleaseDC 0, hdc
    Picture1.AutoRedraw = False
End Sub
------------
这种还能截到鼠标的呢!

#6


截屏就是截窗体,因为"屏幕"也是窗体!修改一下DC就行了嘛,老兄!

#7


表问怎么获取目标窗口的DC,首先用N种方法可以获得该窗口的句柄,用FindWindow最easy了
dim hwnd as long 
dim hdc as long 
hwnd=findwindow(vbnullstring,"窗口标题")
hdc=getDC(hwnd)
ok,hdc就是你要截取的窗口的DC句柄了,下面随意你蹂躏他咯

#8


up

#9


谢谢大家 请问findwindow是一个什么样的子函数啊?

#10


如果一个窗口被最小化了 怎么才能截取到这个窗口的全部内容和信息那?
比如说 这个窗口显示的是一个不停变化的图片但是它被最小化了 那么这个时候怎么实时截取他的信息呢?

#11


Up  比较急用啊 请帮忙 怎么才能用VB实现将一个最小化的窗口里显示的图片信息截出来呢?

#12


哇.最小化的窗体的图片都要截出来呀?

我觉得,只有一个办法.

改变它的状态吧!先把它最大化出来,再截,截了之后再恢复!呵呵!

#13


up

#14


没有什么最大化最小化的,就直接获取图片载体的hwnd,然后再截图。


具体代码请参考MSDN中的
mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\2052\kb.chm::/Source/vbwin/q161299.htm


仔细看看代码就可以更改为你想要的代码了。

#15


请问楼上的是什么意思?

#16


up

#17


有没有办法比较两个时刻图片不同的部分,再把不同的部分提取出来,然后再....

唉,说白了就是怎样用较少的资然做个远程监控的程序

#18


up

#19


mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\2052\kb.chm::/Source/vbwin/q161299.htm

MSDN中有一代码,这是MSDN中的相应地址,如果不会查找,就直接搜索Q161299,就可以看到相关的拷屏的代码了。

这里面的代码是基于hwnd以及Rect获取屏幕图片的,挺管用。

#20


请问是在哪里搜索的?

#21


侃侃

#1


屏幕抓图软件的源程序(Delphi4.0 1.0.0.0版的源程序)
可以定时抓图片

#2


如果是全屏幕的话,这样最方便
把他加在定时器在修改相关的保存语句就可以了
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const theScreen = 1
Const theForm = 0
Private Sub Command1_Click()
Call keybd_event(vbKeySnapshot, theForm, 0, 0)
'若theForm改成theScreen则Copy整个Screen
DoEvents
Picture1.Picture = Clipboard.GetData(vbCFBitmap)
End Sub

#3


看看鄙人这篇文章:
http://blog.csdn.net/xinliangyu/archive/2005/01/31/Save_screen_image_to_a_File_in_VB_propramming.aspx
其下的函数hDCToPicture 变是变指定DC对象上任意矩形区域图形转换成stdPicture对象,该对象可以用savepicture方法保存为图像文件

#4


可是不是截屏幕 是截某一个实时变化的窗口啊

#5


截图的代码好多啊..呵呵,我就收信了两种方式!!(+ laviewpbt)的是第三种了!

Option Explicit

Private Type POINTAPI
    x As Long
    y As Long
End Type
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 Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal hIcon As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function GetCursor Lib "user32" () As Long

Private Sub Command1_Click()
    Dim hdc As Long, nWidth As Integer, nHeight As Integer, nScreenWidth As Integer, nScreenHeight As Integer
    Dim CurPos As POINTAPI
    Dim Cur As Long
    Me.Hide
    DoEvents
    Picture1.AutoRedraw = True
    hdc = GetDC(0)
    nScreenWidth = Screen.Width
    nScreenHeight = Screen.Height
    Picture1.Width = nScreenWidth
    Picture1.Height = nScreenHeight
    nWidth = nScreenWidth / Screen.TwipsPerPixelX
    nHeight = nScreenHeight / Screen.TwipsPerPixelY
    BitBlt Picture1.hdc, 0, 0, nWidth, nHeight, hdc, 0, 0, vbSrcCopy
    Me.Show
    GetCursorPos CurPos
    Cur = GetCursor
    DrawIcon Picture1.hdc, CurPos.x - 10, CurPos.y - 10, Cur
    ReleaseDC 0, hdc
    Picture1.AutoRedraw = False
End Sub
------------
这种还能截到鼠标的呢!

#6


截屏就是截窗体,因为"屏幕"也是窗体!修改一下DC就行了嘛,老兄!

#7


表问怎么获取目标窗口的DC,首先用N种方法可以获得该窗口的句柄,用FindWindow最easy了
dim hwnd as long 
dim hdc as long 
hwnd=findwindow(vbnullstring,"窗口标题")
hdc=getDC(hwnd)
ok,hdc就是你要截取的窗口的DC句柄了,下面随意你蹂躏他咯

#8


up

#9


谢谢大家 请问findwindow是一个什么样的子函数啊?

#10


如果一个窗口被最小化了 怎么才能截取到这个窗口的全部内容和信息那?
比如说 这个窗口显示的是一个不停变化的图片但是它被最小化了 那么这个时候怎么实时截取他的信息呢?

#11


Up  比较急用啊 请帮忙 怎么才能用VB实现将一个最小化的窗口里显示的图片信息截出来呢?

#12


哇.最小化的窗体的图片都要截出来呀?

我觉得,只有一个办法.

改变它的状态吧!先把它最大化出来,再截,截了之后再恢复!呵呵!

#13


up

#14


没有什么最大化最小化的,就直接获取图片载体的hwnd,然后再截图。


具体代码请参考MSDN中的
mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\2052\kb.chm::/Source/vbwin/q161299.htm


仔细看看代码就可以更改为你想要的代码了。

#15


请问楼上的是什么意思?

#16


up

#17


有没有办法比较两个时刻图片不同的部分,再把不同的部分提取出来,然后再....

唉,说白了就是怎样用较少的资然做个远程监控的程序

#18


up

#19


mk:@MSITStore:C:\Program%20Files\Microsoft%20Visual%20Studio\MSDN98\98VS\2052\kb.chm::/Source/vbwin/q161299.htm

MSDN中有一代码,这是MSDN中的相应地址,如果不会查找,就直接搜索Q161299,就可以看到相关的拷屏的代码了。

这里面的代码是基于hwnd以及Rect获取屏幕图片的,挺管用。

#20


请问是在哪里搜索的?

#21


侃侃