0

目前我有以下 VB.NET 代码来制作我的桌面截图,但它只拍摄活动屏幕的图片:

Public Function SaveScreen(ByVal theFile As String) As Boolean

        Try
            SendKeys.Send("%{PRTSC}")          '<alt + printscreen>
            Application.DoEvents()

            Dim data As IDataObject = Clipboard.GetDataObject()

            If data.GetDataPresent(GetType(System.Drawing.Bitmap)) Then
                Dim bmp As Bitmap = CType(data.GetData(GetType(System.Drawing.Bitmap)), Bitmap)
                bmp.Save(theFile, Imaging.ImageFormat.Png)
            End If
            Clipboard.SetDataObject(0)      'save memory by removing the image from the clipboard
            Return True
        Catch ex As Exception
            Return False
        End Try

    End Function

以下代码是我执行上述函数的方式,如果它有任何区别,我认为它不会:

SaveScreen("C:\Lexer_trace\screen.png")

现在,我需要能够拍摄整个屏幕的照片,而不仅仅是聚焦的窗口。我该怎么做?

提前致谢,

洛根

4

4 回答 4

4

您应该使用System.Drawing.Graphics.CopyFromScreen() See Here从屏幕复制

只需查询屏幕的完整尺寸以作为点传递。类似于你所拥有的东西.CopyFromScreen()

Public Sub SaveScreen(filename As String)

    Dim screenSize = SystemInformation.PrimaryMonitorSize
    Dim bitmap = New Bitmap(screenSize.Width, screenSize.Height)
    Dim g = Graphics.FromImage(bitmap)

    g.CopyFromScreen(New Point(0, 0), New Point(0, 0), screenSize)
    g.Flush()
    bitmap.Save(filename, System.Drawing.Imaging.ImageFormat.Png)

End Sub
于 2011-07-06T19:28:26.840 回答
2

您的评论说您发送alt + printscreen的只是捕获当前活动的窗口。

如果您只是发送printscreen它应该捕获整个桌面。

于 2011-07-06T19:26:34.543 回答
0

那么直接的解决方法是只发送打印屏幕:

SendKeys.Send("{PRTSC}")

但这充其量只是一个蹩脚的黑客攻击。要可靠地截取屏幕截图,您需要使用GetDC桌面句柄 (0) 的 P/Invoke 并将BitBlt其内容放入Bitmap. 完成之前不要忘记ReleaseDC桌面的 DC。

或使用Graphics.CopyFromScreen

于 2011-07-06T19:28:34.933 回答
0

您是否也尝试过不发送 Alt 键?

就像是:

SendKeys.Send("{PRTSC}")          '<printscreen> 
于 2011-07-06T19:30:29.913 回答