0

我正在开发一个程序,该程序将允许用户截取全屏游戏的屏幕截图,例如使命召唤、战地 3 等。

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

首先,我必须按两次快捷方式,而不是像其他快捷方式那样按一次。这只发生在下面的代码实际上在处理子中时。如果我在按下快捷方式时只显示一个消息框,那么它每次都有效。

其次,每当我截取屏幕截图时,它要么完全变黑,要么截取我的桌面,即使前台正在运行游戏。

我环顾四周,似乎 printscreen 是通过 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
4

1 回答 1

1

PrintScreen 由 Win32 环境处理,该环境处理窗口的正常绘制。因此,如果 PrintScreen 键进入 Win32 (没有被游戏吞噬),它可能会截取当前正在绘制的内容,就像你说的那样,它要么是你的桌面,要么什么都没有(黑色的)。

您可以尝试使用GDIBitBlt屏幕 DC内存 DC(就像大多数屏幕捕获程序所做的那样),但这不能保证有效。这是一个大问题。在游戏中按 Print Screen,然后粘贴到 MS 绘图中真的有效吗?如果不是,那么您可能不走运,没有深入研究 directX 方面的内容。

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

于 2012-05-01T21:47:11.110 回答