【发布时间】:2013-09-10 02:26:27
【问题描述】:
大家好,我这里有这段代码:
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
现在,即使窗口不在屏幕上,上面的代码确实也会捕获图像。上面代码的问题是我不能告诉它只捕获那个窗口中的一个区域,而我可以用我第一次发布的 CopyFromScreen 来完成。
这可以使用 PrintWindow 吗?
【问题讨论】:
-
自己裁剪图像。
-
@HansPassant 感谢您指出正确的方向。
标签: vb.net graphics screenshot screen-capture