嘿,我在这里有这个代码:
Dim p As Process = Process.GetProcessesByName("Cal").FirstOrDefault
Dim target_hwnd As Long = FindWindow(vbNullString, "Calculator")
If p IsNot Nothing Then
SetWindowPos(target_hwnd, 0, winSize(0), winSize(1), winSize(2), winSize(3), 0)
AppActivate(p.Id)
Dim img As New Bitmap(145, 145) 'size fo the caption area
Dim gr As Graphics = Graphics.FromImage(img)
'sets the offsets and use image size to set region
gr.CopyFromScreen(New Point(winSize(0) + 44, winSize(1) + 179), Point.Empty, img.Size)
img.Save("test.jpg", Drawing.Imaging.ImageFormat.Jpeg)
Process.Start("test.jpg")
End If
只要我在视图中窗口,就可以毫无问题地拍摄屏幕。但是当我将表单移出屏幕(我无法看到它)时,它只捕获黑色图像。
我一直在试用这段代码:
Private Declare Function PrintWindow Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hdcBlt As IntPtr, ByVal nFlags As UInt32) As Boolean
Dim screenCapture As Bitmap
Dim otherForm As New Form
Private Sub CaptureScreen()
Dim target_hwnd As Long = FindWindow(vbNullString, "Calculator")
SetWindowPos(target_hwnd, 0, winSize(0), winSize(1), winSize(2), winSize(3), 0)
screenCapture = New Bitmap(245, 245)
Dim g As Graphics = Graphics.FromImage(screenCapture)
Dim hdc As IntPtr = g.GetHdc
Form1.PrintWindow(target_hwnd, hdc, Nothing)
g.ReleaseHdc(hdc)
g.Flush()
g.Dispose()
If IO.File.Exists("d:\test.jpg") Then
IO.File.Delete("d:\test.jpg")
End If
screenCapture.Save("d:\test.jpg", Drawing.Imaging.ImageFormat.Jpeg)
End Sub
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
CaptureScreen()
End Sub
现在上面的代码 DOES 即使窗口在屏幕外也能捕获图像。上面代码的问题在于我无法告诉它只捕获该窗口中我能够使用我首次发布的 CopyFromScreen 进行的区域。
是否可以使用 PrintWindow ?
答案 0 :(得分:0)
我能够做到这一点:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim fileName = "Calculator.jpg"
Dim fileNameCrop = "Calculator-crop.jpg"
' |--b|---|x|
' | | | a|-Form Left to image area
' | V | | b|-Form Top to image area
' a-->[c] | | | c|-Image area Width to capture
' | | | | | c|-Image area Height to capture
' |_________| V V V V
Dim CropRect As New Rectangle(97, 189, 36, 29)
Dim OrignalImage = Image.FromFile(fileName)
Dim CropImage = New Bitmap(CropRect.Width, CropRect.Height)
Using grp = Graphics.FromImage(CropImage)
grp.InterpolationMode = Drawing2D.InterpolationMode.NearestNeighbor
grp.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
grp.DrawImage(OrignalImage, New Rectangle(0, 0, CropRect.Width, CropRect.Height), CropRect, GraphicsUnit.Pixel)
CropImage.Save(fileNameCrop)
End Using
OrignalImage.Dispose()
CropImage.Dispose()
'delete org image
If FileIO.FileSystem.FileExists(fileName) Then FileIO.FileSystem.DeleteFile(fileName)
End Sub
在之后裁剪区域我从OP中发布的第一个代码中保存了表单图像。