2012-05-01 65 views
0

我工作的一個程序,這將使用戶可以利用全屏幕遊戲,如使命召喚,戰地3等VB.net以在遊戲中的截圖

不過,我截圖我的代碼有兩個問題。

首先,我不得不按兩次快捷鍵,而不是像我的其他快捷鍵一樣。僅當下面的代碼實際處於處理子部分時纔會發生這種情況。如果我按下快捷鍵時只顯示一個消息框,則每次都有效。第二,每當我截取屏幕截圖時,即使遊戲在前臺運行,它也會完全呈現黑色,或拍攝我的桌面。

我環顧四周,看起來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 

回答

1

PrintScreen由Win32環境處理,它處理Windows的正常繪圖。因此,如果PrintScreen鍵進入Win32(不會被遊戲吞噬),它可能會捕獲它正在繪製的內容,就像你說的那樣,它不是你的桌面,就是沒有任何東西(黑色)。

你可以嘗試使用GDIBitBltScreen'sDCmemory DC(因爲大多數截屏程序做的)但是這不能保證工作。這是一個很大的問題。在遊戲中時是否真的按下了「打印屏幕」,然後進入並粘貼到MS Paint實際上工作?如果不是的話,那麼你可能會不走運,不會深入DirectX的一面。

Paul-Jan指出了這個密切相關的SO問題:Take screenshot of DirectX full-screen application其中建議使用微軟的Detours鉤住/測試執行幀捕獲所需的DirectX調用。

+0

然後你會推薦什麼?我見過的所有東西都表示使用printscreen來處理屏幕截圖。 – Justin

+1

你顯然沒有看到這一切呢 - http://stackoverflow.com/questions/1962142/take-screenshot-of-directx-full-screen-application –