■49416 / inTopicNo.1) |
VB.NETを使用したDirectXキャプチャ |
□投稿者/ シノ (3回)-(2010/05/04(Tue) 08:52:21)
|
分類:[VB.NET/VB2005 以降]
2010/05/04(Tue) 22:05:02 編集(投稿者) 2010/05/04(Tue) 22:04:51 編集(投稿者)
VB.NETを使用し、DirectXのウィンドー(3Dゲーム)のキャプチャツールを作ろうと思っています。 環境:WindowsXP(32bit)、VB2008
参考記事 http://bbs.wankuma.com/index.cgi?mode=al2&namber=33765&KLOG=59
上記の記事をVB風に書き換えました。 ---------------------------------------------------- Imports Microsoft.DirectX Imports Microsoft.DirectX.Direct3D Imports System.Runtime.InteropServices Imports System.Drawing.Imaging
Public Class Form1 Private Class GDI32 Public Const SRCCOPY As Integer = &HCC0020 <DllImport("gdi32.dll")> _ Public Shared Function BitBlt(ByVal hObject As IntPtr, ByVal nXDest As Integer, ByVal nYDest As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hObjectSource As IntPtr, _ ByVal nXSrc As Integer, ByVal nYSrc As Integer, ByVal dwRop As Integer) As Boolean End Function End Class Private Class User32 <DllImport("user32.dll")> _ Public Shared Function GetDesktopWindow() As IntPtr End Function End Class
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim hDesktopWind As IntPtr = FindWindowEx(0, 0, "ウィンドータイトル", vbNullString) Dim param As New PresentParameters() param.Windowed = True param.SwapEffect = SwapEffect.Copy param.PresentationInterval = PresentInterval.Immediate Dim device As New Device(0, DeviceType.Hardware, hDesktopWind , CreateFlags.SoftwareVertexProcessing, param)
Dim sf As Surface = device.CreateOffscreenPlainSurface(device.DisplayMode.Width, device.DisplayMode.Height, Format.A8R8G8B8, Pool.SystemMemory) device.GetFrontBufferData(0, sf)
Dim g As Graphics = sf.GetGraphics() Dim captureBtm As New Bitmap(device.DisplayMode.Width, device.DisplayMode.Height, g) Dim gd As Graphics = Graphics.FromImage(captureBtm) Dim hdcS As IntPtr = g.GetHdc() Dim hdcD As IntPtr = gd.GetHdc() GDI32.BitBlt(hdcD, 0, 0, device.DisplayMode.Width, device.DisplayMode.Height, hdcS, 0, 0, GDI32.SRCCOPY) gd.ReleaseHdc(hdcD) g.ReleaseHdc(hdcS) sf.ReleaseGraphics() captureBtm.Save("D:\test.bmp", ImageFormat.Bmp) captureBtm.Dispose() gd.Dispose() g.Dispose() sf.Dispose() device.Dispose() End Sub End Class --------------------------------------------------- 元の記事が IntPtr hDesktopWind = User32.GetDesktopWindow(); となっていたので、
FindWindowEx(0, 0, "ウィンドータイトル", vbNullString) とすれば目的のウィンドーのキャプチャを撮れると考えたのですが、常にデスクトップ全体のハードコピーが保存されます。
特定のウィンドーをキャプチャするにはどのような設定をすれば良いかわかる方、いましたらお願いします。
|
|