利用vb捕捉并保存屏幕图像_第1页
利用vb捕捉并保存屏幕图像_第2页
利用vb捕捉并保存屏幕图像_第3页
利用vb捕捉并保存屏幕图像_第4页
利用vb捕捉并保存屏幕图像_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

利用 VB 捕捉并保存屏幕图像大家知道在 VB 下利用 API 函数 Bitblt 可以将屏幕或者窗口上的图象拷贝到VB 中的 PictureBox 对象中,但是如果简单的利用 PictureBox 的 SavePicture函数来保存图象,会发现什么也保存不了。这篇文章就是介绍如何捕获并利用Windows 下的 OLE API 函数保存图象。首先来看源程序,首先建立一个新的工程文件,然后在 Form1 中加入 5 个CommandButton 对象和一个 PictureBox 对象,然后在 Form1 中加入以下代码:Option ExplicitOption Base 0Private Type PALETTEENTRYpeRed As BytepeGreen As BytepeBlue As BytepeFlags As ByteEnd TypePrivate Type LOGPALETTEpalVersion As IntegerpalNumEntries As IntegerpalPalEntry(255) As PALETTEENTRYEnd TypePrivate Type GUIDData1 As LongData2 As IntegerData3 As IntegerData4(7) As ByteEnd TypePrivate Const RASTERCAPS As Long = 38Private Const RC_PALETTE As Long = &H100Private Const SIZEPALETTE As Long = 104Private Type RECTLeft As LongTop As LongRight As LongBottom As LongEnd TypePrivate Declare Function CreateCompatibleDC Lib “GDI32“ (ByVal hDC As Long) As LongPrivate Declare Function CreateCompatibleBitmap Lib “GDI32“ (ByVal hDC As Long, _ByVal nWidth As Long, ByVal nHeight As Long) As LongPrivate Declare Function GetDeviceCaps Lib “GDI32“ (ByVal hDC As Long, ByVal _iCapabilitiy As Long) As LongPrivate Declare Function GetSystemPaletteEntries Lib “GDI32“ (ByVal hDC As Long, _ByVal wStartIndex As Long, ByVal wNumEntries As Long, lpPaletteEntries _As PALETTEENTRY) As LongPrivate Declare Function CreatePalette Lib “GDI32“ (lpLogPalette As LOGPALETTE) _As LongPrivate Declare Function SelectObject Lib “GDI32“ (ByVal hDC As Long, ByVal hObject _As Long) As LongPrivate Declare Function BitBlt Lib “GDI32“ (ByVal hDCDest As Long, ByVal XDest As _Long, ByVal YDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, _ByVal hDCSrc As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop _As Long) As LongPrivate Declare Function DeleteDC Lib “GDI32“ (ByVal hDC As Long) As LongPrivate Declare Function GetForegroundWindow Lib “USER32“ () As LongPrivate Declare Function SelectPalette Lib “GDI32“ (ByVal hDC As Long, ByVal hPalette _As Long, ByVal bForceBackground As Long) As LongPrivate Declare Function RealizePalette Lib “GDI32“ (ByVal hDC As Long) As LongPrivate Declare Function GetWindowDC Lib “USER32“ (ByVal hWnd As Long) As LongPrivate Declare Function GetDC Lib “USER32“ (ByVal hWnd As Long) As LongPrivate Declare Function GetWindowRect Lib “USER32“ (ByVal hWnd As Long, lpRect As _RECT) As LongPrivate Declare Function ReleaseDC Lib “USER32“ (ByVal hWnd As Long, ByVal hDC As _Long) As LongPrivate Declare Function GetDesktopWindow Lib “USER32“ () As LongPrivate Type PicBmpSize As LongType As LonghBmp As LonghPal As LongReserved As LongEnd TypePrivate Declare Function OleCreatePictureIndirect Lib “olepro32.dll“ (PicDesc As _PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long捕捉整个屏幕Private Sub Command1_Click()Set Picture1.Picture = CaptureScreen()End Sub在两秒钟后捕捉当前的活动窗口Private Sub Command2_Click()MsgBox “当你关闭这个对话框两秒钟之后程序会捕捉处于活动状态的窗口.“等待两秒钟Dim EndTime As DateEndTime = DateAdd(“s“, 2, Now)Do Until Now EndTimeDoEventsLoopSet Picture1.Picture = CaptureActiveWindow()Me.SetFocusEnd SubPrivate Sub Command3_Click()Set Picture1.Picture = NothingEnd SubPublic Function CreateBitmapPicture(ByVal hBmp As Long, ByVal hPal As Long) As PictureDim r As LongDim Pic As PicBmpDim IPic As IPictureDim IID_IDispatch As GUID填充 IDispatch 界面With IID_IDispatch.Data1 = &H20400.Data4(0) = &HC0.Data4(7) = &H46End With填充 PicWith Pic.Size = Len(Pic) Pic 结构长度.Type = vbPicTypeBitmap 图象类型.hBmp = hBmp 位图句柄.hPal = hPal 调色板句柄End With建立 Picture 图象r = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)返回 Picture 对象Set CreateBitmapPicture = IPicEnd FunctionPublic Function CaptureWindow(ByVal hWndSrc As Long, ByVal Client As Boolean, ByVal _LeftSrc As Long, ByVal TopSrc As Long, ByVal WidthSrc As Long, ByVal HeightSrc _As Long) As PictureDim hDCMemory As LongDim hBmp As LongDim hBmpPrev As LongDim r As LongDim hDCSrc As LongDim hPal As LongDim hPalPrev As LongDim RasterCapsScrn As LongDim HasPaletteScrn As LongDim PaletteSizeScrn As LongDim LogPal As LOGPALETTEIf Client ThenhDCSrc = GetDC(hWndSrc)ElsehDCSrc = GetWindowDC(hWndSrc)End IfhDCMemory = CreateCompatibleDC(hDCSrc)hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc)hBmpPrev = SelectObject(hDCMemory, hBmp)获得屏幕属性RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS)HasPaletteScrn = RasterCapsScrn And RC_PALETTEPaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE)如果屏幕对象有调色板则获得屏幕调色板If HasPaletteScrn And (PaletteSizeScrn = 256) Then建立屏幕调色板的拷贝LogPal.palVersion = &H300LogPal.palNumEntries = 256r = GetSystemPaletteEntries(hDCSrc, 0, 256, LogPal.palPalEntry(0)hPal = CreatePalette(LogPal)将新建立的调色板选如建立的内存绘图句柄中hPalPrev = SelectPalette(hDCMemory, hPal, 0)r = RealizePalette(hDCMemory)End If拷贝图象r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, vbSrcCopy)hBmp = SelectObject(hDCMemory, hBmpPrev)If HasPaletteScrn And (PaletteSizeScrn = 256) ThenhPal = SelectPalette(hDCMemory, hPalPrev, 0)End If释放资源r = DeleteDC(hDCMemory)r = ReleaseDC(hWndSrc, hDCSrc)Set CaptureWindow = CreateBitmapPicture(hBmp, hPal)End Functioncapturescreen 函数捕捉整个屏幕图象Public Function CaptureScreen() As PictureDim hWndScreen As Long获得桌面的窗口句柄hWndScreen = GetDesktopWindow()Set CaptureScreen = CaptureWindow(hWndScreen, False, 0, 0, Screen.Width _ Screen.TwipsPerPixelX, Screen.Height Screen.TwipsPerPixelY)End FunctionPublic Function CaptureActiveWindow() As PictureDim hWndActive As LongDim r As LongDim RectActive As RECThWndActive = GetForegroundWindow()r = GetWindowRect(hWndActive, RectActive)Set CaptureActiveWindow = CaptureWindow(hWndActive, False, 0, 0, _RectActive.Right - RectActive.Left, RectActive.Bottom - RectActive.Top)End FunctionPublic Sub PrintPictureToFitPage(Prn As Printer, Pic As Picture)Const vbHiMetric As Integer = 8Dim PicRatio As DoubleDim PrnWidth As DoubleDim PrnHeight As DoubleDim PrnRatio As DoubleDim PrnPicWidth As DoubleDim PrnPicHeight As DoubleIf Pic.Height = Pic.Width ThenPrn.Orientation = vbPRORPortraitElsePrn.Orientation = vbPRORLandscapeEnd IfPicRatio = Pic.Width / Pic.HeightPrnWidth = Prn.ScaleX(Prn.ScaleWidth, Prn.ScaleMode, vbHiMetric)PrnHeight = Prn.ScaleY(Prn.ScaleHeight, Prn.ScaleMode, vbHiMetric)PrnRatio = PrnWidth / PrnHeightIf PicRatio = PrnRatio ThenPrnPicWidth = Prn.ScaleX(PrnWidth, vbHiMetric, Prn.ScaleMode)PrnPicHeight = Prn.ScaleY(PrnWidth / PicRatio, vbHiMetric, Prn.ScaleMode)ElsePrnPicHeight = Prn.ScaleY(PrnHeight, vbHiMetric, Prn.ScaleMode)PrnPicWidth = Prn.ScaleX(PrnHeight * PicRatio, vbHiMetric, Prn.ScaleMode)End IfPrn.PaintPicture Pic, 0, 0, PrnPicWidth, PrnPicHeightEnd SubPrivate Sub Command4_Click()CommonDialog1.DefaultExt = “.BMP“CommonDialog1.Filter = “Bitmap Image (*.bmp)|*.bmp“CommonDialog1.ShowSaveIf CommonDialog1.FileName “ ThenSavePicture Picture1.Picture, CommonDialog1.FileNameEnd IfEnd SubPrivate Sub

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论