C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: VB.NETを使用したDirectXキャプチャ


(過去ログ 83 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■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)
とすれば目的のウィンドーのキャプチャを撮れると考えたのですが、常にデスクトップ全体のハードコピーが保存されます。

特定のウィンドーをキャプチャするにはどのような設定をすれば良いかわかる方、いましたらお願いします。

引用返信 編集キー/
■49431 / inTopicNo.2)  Re[1]: VB.NETを使用したDirectXキャプチャ
□投稿者/ やじゅ (1601回)-(2010/05/04(Tue) 21:02:41)
やじゅ さんの Web サイト
No49416 (シノ さん) に返信
> FindWindowEx(0, 0, "ウィンドータイトル", vbNullString)
> とすれば目的のウィンドーのキャプチャを撮れると考えたのですが、常にデスクトップ全体のハードコピーが保存されます。
>
> 特定のウィンドーをキャプチャするにはどのような設定をすれば良いかわかる方、いましたらお願いします。

FindWindowExの第一引数が0だとデスクトップになります。第一引数に目的のウィンドウハンドルを指定すればよいです。
http://msdn.microsoft.com/ja-jp/library/cc410853.aspx

「FindWindow」あたりで、目的のウィンドウハンドルを取得するようにしてみてはいかがでしょう。
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/vb_t02.htm
引用返信 編集キー/
■49432 / inTopicNo.3)  Re[2]: VB.NETを使用したDirectXキャプチャ
□投稿者/ シノ (4回)-(2010/05/04(Tue) 22:01:40)
お返事ありがとうございます。
FindWindowを試しましたが上手く行きませんでした。
Spy++で直に取ってきたハンドルも試してみましたがダメでした。
もう少し調べてみます。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -