0

Call of Duty、Battlefield 3 などのフルスクリーン ゲームのスクリーンショットをユーザーが撮影できるようにするプログラムに取り組んでいます。

ただし、コードには 2 つの問題があります。

まず、他のショートカットのように 1 回ではなく、2 回ショートカットを押す必要があります。これは、以下のコードが実際に処理サブにある場合にのみ発生します。ショートカットが押されたときにメッセージボックスを表示するだけであれば、毎回機能します。

2 つ目は、スクリーンショットを撮るたびに、画面が完全に真っ黒になるか、フォアグラウンドでゲームが実行されているにもかかわらず、デスクトップのショットが撮られることです。

いろいろ調べてみたところ、vb.net からゲームのスクリーンショットを取得する唯一の方法は printscreen のようです。

私のコードは以下です。どんな助けでも大歓迎です。

    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 に到達した場合 (ゲームによって飲み込まれない場合)、おそらく現在描画しているもののスクリーン キャプチャを取得することになります。これは、あなたが言ったように、デスクトップであるか、何もない (黒)。

GDIを使用して、画面のDCからメモリ DCへのBitBltを試すことができますが(ほとんどの画面キャプチャ プログラムがそうであるように)、動作する保証はありません。ここに大きな疑問があります。ゲーム中に実際に Print Screen を押してから、MS ペイントに移動して貼り付けることは実際に機能しますか? そうでない場合は、directX 側を掘り下げることなく、運が悪い可能性があります。

Paul-Janは、この密接に関連する SO の質問を指摘しました:フレーム キャプチャを行うために必要な DirectX 呼び出しをフック/インスツルメントするために、Microsoft のDetoursの使用を推奨するDirectX フルスクリーン アプリケーションのスクリーンショットを撮ります。

于 2012-05-01T21:47:11.110 に答える