我正在制作一个程序,允许用户截取全屏游戏的截图,例如“使命召唤”,“战地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
答案 0 :(得分:1)
PrintScreen由Win32环境处理,该环境处理Windows的正常绘制。因此,如果PrintScreen键进入Win32(不会被游戏吞噬),它可能会捕获当前正在绘制的内容,就像你说的那样,它是你的桌面,或者没事(黑色)。
您可以尝试使用GDI BitBlt从Screen's DC到memory DC(正如大多数屏幕捕获程序所做的那样),但是'不能保证工作。这是一个大问题。你是否真的在游戏中按下Print Screen,然后去粘贴到MS画面实际上有效?如果不是,那么你可能没有运气,没有深入研究directX方面。
Paul-Jan指出了这个密切相关的SO问题:Take screenshot of DirectX full-screen application建议使用Microsoft的Detours来挂钩/检测执行帧捕获所需的DirectX调用