这段时间做了很多VBA外挂用来抓取网页上的数据保存到excel(用Webbrowser控件),现在又遇到一个网页截图保存的需求。微软kb210108的代码只能截取当前活动窗口,不能后台工作,也不能有其它窗口覆盖在上面。我把它扩展成了可截取任意指定的窗口,可以后台截图,不怕覆盖的版本。在Win7下即使最小化也可以截屏,XP下需要把待截图的窗口做成showmodal,但即使这样XP也要在截图时避免使用显示桌面,否则截出来的是黑屏。
顺便做了按指定尺寸剪切图像的参数。截屏结果保存到剪贴板,可以通过网上的CliptoJPG VB代码方便地保存到JPG文件。
如果VBA的Webbrowser也支持DrawToBitmap方法,我才不用费这个劲……另,听说DrawToBitmap有很多bug。
Function ScreenDump(ByVal hWnd As Long, Optional ByVal croptop As Integer = 0, Optional ByVal cropbottom As Integer = 0, Optional ByVal cropleft As Integer = 0, Optional ByVal cropright As Integer = 0) As String 'Dump the screen of specified form and save to clipboard. 'hWnd is the handle of target form, croptop/cropbottom/cropleft/cropright are pixels to crop, 0 by default means no crop. 'Return string message Dim UserFormHwnd As Long, DeskHwnd As Long Dim hdc As Long Dim hdcMem, hdcMemc As Long Dim hBitmap, hBitmapc As Long Dim rect As RECT_Type Dim retval As Long Dim fwidth As Long, fheight As Long Dim isCrop As Boolean If croptop < 0 Or cropbottom < 0 Or cropleft < 0 Or cropright < 0 Then ScreenDump = "0-Wrong parameter" Exit Function End If If croptop > 0 Or cropbottom > 0 Or cropleft > 0 Or cropright > 0 Then isCrop = True End If ' Get window handle DeskHwnd = GetDesktopWindow() UserFormHwnd = hWnd ' Get screen coordinates Call GetWindowRect(UserFormHwnd, rect) fwidth = rect.right - rect.left fheight = rect.bottom - rect.top ' Get the device context of Desktop and allocate memory hdc = GetDC(DeskHwnd) hdcMem = CreateCompatibleDC(hdc) hBitmap = CreateCompatibleBitmap(hdc, fwidth, fheight) If hBitmap <> 0 Then retval = SelectObject(hdcMem, hBitmap) 'Redraw window before capture RedrawWindow UserFormHwnd, ByVal 0, ByVal 0, RDW_INVALIDATE Or RDW_ALLCHILDREN Or RDW_UPDATENOW ' Copy bitmap to memory location retval = PrintWindow(UserFormHwnd, hdcMem, 0) 'Crop image If isCrop = True Then fwidth = fwidth - cropleft - cropright fheight = fheight - croptop - cropbottom 'Allocate memory for cropped image hdcMemc = CreateCompatibleDC(hdc) hBitmapc = CreateCompatibleBitmap(hdc, fwidth, fheight) retval = SelectObject(hdcMemc, hBitmapc) 'Crop retval = BitBlt(hdcMemc, 0, 0, fwidth, fheight, hdcMem, cropleft, croptop, SRCCOPY) 'Set up the Clipboard and copy bitmap retval = OpenClipboard(DeskHwnd) retval = EmptyClipboard() retval = SetClipboardData(CF_BITMAP, hBitmapc) retval = CloseClipboard() 'Clean up retval = DeleteDC(hdcMemc) retval = DeleteObject(hBitmapc) Else 'Set up the Clipboard and copy bitmap retval = OpenClipboard(DeskHwnd) retval = EmptyClipboard() retval = SetClipboardData(CF_BITMAP, hBitmap) retval = CloseClipboard() End If ScreenDump = "1-Success" Else ScreenDump = "2-No bitmap" End If ' Clean up retval = DeleteDC(hdcMem) retval = ReleaseDC(DeskHwnd, hdc) retval = DeleteObject(hBitmap) End Function
以上。
旧调重弹的老狼
不知道是什么原因找到了老狼的这个狼窝,我想老狼应该也是年纪很大的叔叔了吧