VB.net采取游戏截图

时间:2012-05-01 21:42:52

标签: vb.net directx screenshot fullscreen

我正在制作一个程序,允许用户截取全屏游戏的截图,例如“使命召唤”,“战地3”等。

但是,我的代码存在两个问题。

首先,我必须按两次快捷方式,而不是像我的其他快捷方式一样。仅当下面的代码实际位于处理子中时才会发生这种情况。如果我按下快捷方式时只显示消息框,则每次都有效。

其次,无论何时我拍摄截图,它都要么全黑,要么拍摄我的桌面,即使有一个游戏在前台运行。

我环顾四周,看来printcreen是通过vb.net获取游戏截图的唯一方法。

我的代码如下。任何帮助表示赞赏。

    Private Sub game_Press(ByVal s As Object, ByVal e As Shortcut.HotKeyEventArgs) Handles gamewindow.press
    Dim gamewin As RECT
    If GetWindowRect(GetForegroundWindow, gamewin) Then
        Dim bmp As Bitmap
        Dim gfx As Graphics
        SendKeys.Send("%{PRTSC}")
        Dim getscrn As IDataObject = Clipboard.GetDataObject()
        Dim bmpsize As New Size(gamewin._Right - gamewin._Left, gamewin._Bottom - gamewin._Top)
        bmp = New Bitmap(CType(getscrn.GetData(GetType(System.Drawing.Bitmap)), Bitmap))

        gfx = Graphics.FromImage(bmp)
        gfx.CopyFromScreen(gamewin._Left, gamewin._Top, 0, 0, New Size(bmpsize.Width, bmpsize.Height), CopyPixelOperation.SourceCopy)
        Dim sr As New System.Threading.Thread(AddressOf uploadimage)
        sr.IsBackground = True
        sr.SetApartmentState(Threading.ApartmentState.STA)
        sr.Start(bmp)
        gfx.Dispose()
    End If
End Sub

1 个答案:

答案 0 :(得分:1)

PrintScreen由Win32环境处理,该环境处理Windows的正常绘制。因此,如果PrintScreen键进入Win32(不会被游戏吞噬),它可能会捕获当前正在绘制的内容,就像你说的那样,它是你的桌面,或者没事(黑色)。

您可以尝试使用GDI BitBltScreen's DCmemory DC(正如大多数屏幕捕获程序所做的那样),但是'不能保证工作。这是一个大问题。你是否真的在游戏中按下Print Screen,然后去粘贴到MS画面实际上有效?如果不是,那么你可能没有运气,没有深入研究directX方面。

Paul-Jan指出了这个密切相关的SO问题:Take screenshot of DirectX full-screen application建议使用Microsoft的Detours来挂钩/检测执行帧捕获所需的DirectX调用