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

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

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

Re[4]: 画面のキャプチャ


(過去ログ 59 を表示中)

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

■33765 / inTopicNo.1)  画面のキャプチャ
  
□投稿者/ 山崎 (1回)-(2009/03/09(Mon) 16:40:18)

分類:[.NET 全般] 

はじめまして、山崎といいます。
ゲーム等のDirectXを使用したアプリ等を含めたディスクトップ画面の静止画キャプチャを作りたいと思ってます。
VisualC#2008で作成したのですが、肝心のDirectXを使用したアプリがあると"D3DERR_INVALIDCALL"のエラーがでてしまいます。
通常アプリだけだと正常にキャプチャできています。
どのあたりを修正すればよいのか、或いは別な方法があれば教えて戴きたいです。よろしくお願いします。

using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

        private class GDI32
        {
            public const int SRCCOPY    = 0x00CC0020;
            [DllImport("gdi32.dll")]
            public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hObjectSource, int nXSrc, int nYSrc, int dwRop);
        }
        private class User32
        {
            [DllImport("user32.dll")]
            public static extern IntPtr GetDesktopWindow();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr hDesktopWind = User32.GetDesktopWindow();
            PresentParameters param = new PresentParameters();
            param.Windowed = true;
            param.SwapEffect = SwapEffect.Copy;
            param.PresentationInterval = PresentInterval.Immediate;
            Device device = new Device(Manager.Adapters.Default.Adapter, DeviceType.Hardware, hDesktopWind, CreateFlags.SoftwareVertexProcessing, param);
            Surface sf = device.CreateOffscreenPlainSurface(device.DisplayMode.Width, device.DisplayMode.Height, Format.A8R8G8B8, Pool.SystemMemory);
            device.GetFrontBufferData(0, sf); //エラーが起こる
            Graphics g = sf.GetGraphics();
            Bitmap captureBtm = new Bitmap(device.DisplayMode.Width, device.DisplayMode.Height, g);
            Graphics gd = Graphics.FromImage(captureBtm);
            IntPtr hdcS = g.GetHdc();
            IntPtr hdcD = 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();
        }

引用返信 編集キー/
■33767 / inTopicNo.2)  Re[1]: 画面のキャプチャ
□投稿者/ オショウ (110回)-(2009/03/09(Mon) 16:55:02)
> どのあたりを修正すればよいのか、或いは別な方法があれば教えて戴きたいです。よろしくお願いします。

  http://vision.kuee.kyoto-u.ac.jp/~nob/doc/csharp/csharp.html#doc1_218

  参考・・・と言うかそのもの!

以上。
引用返信 編集キー/
■33770 / inTopicNo.3)  Re[2]: 画面のキャプチャ
□投稿者/ 山崎 (2回)-(2009/03/09(Mon) 17:12:34)
No33767 (オショウ さん) に返信
オショウさんこんにちは、レスありがとうございます。
>   http://vision.kuee.kyoto-u.ac.jp/~nob/doc/csharp/csharp.html#doc1_218
このページのとおりにやると真っ黒なBMPができてしまうです。
それでバックバッファーじゃだめでフロントバッファーではないかと思って作ってみたんですが。

引用返信 編集キー/
■33776 / inTopicNo.4)  Re[3]: 画面のキャプチャ
□投稿者/ オショウ (111回)-(2009/03/09(Mon) 18:17:08)
> このページのとおりにやると真っ黒なBMPができてしまうです。
> それでバックバッファーじゃだめでフロントバッファーではないかと思って作ってみたんですが。

  それはちゃんとDirectXのウィンドウ(デバイス)が渡っていないのでは?

  それと、キャプチャーするなら、該当するウィンドウが通常のウィンドウか
  DirectXか見極めないとDirectX以外のウィンドウを上記のURLの関数に、
  無理やり?渡しても真っ黒になったりしますが・・・

  DirectXのウィンドウをキャプチャするのにどうやってサンプル表示された
  ものをキャプチャさせてます?

  それと・・・
  環境としてOSは?
  インストールされているDirectXのバージョンは?

以上。
引用返信 編集キー/
■33777 / inTopicNo.5)  Re[3]: 画面のキャプチャ
□投稿者/ オショウ (112回)-(2009/03/09(Mon) 18:20:15)
追伸・・・

当初の掲載されているコードでは、デスクトップのウィンドウハンドルを
渡してますネ!

デスクトップがDirectX と言う前提なら、VISTAのAEROですか?〜
エラーするなら、違う(DirectXではない)と思われますが。

以上。
引用返信 編集キー/
■33779 / inTopicNo.6)  Re[4]: 画面のキャプチャ
□投稿者/ 山崎 (3回)-(2009/03/09(Mon) 18:37:12)
No33777 (オショウ さん) に返信
こんにちは。
> デスクトップがDirectX と言う前提なら、VISTAのAEROですか?〜

おしゃっとるとおり、VistaのAEROです。

> エラーするなら、違う(DirectXではない)と思われますが。
私のコードでは、通常は大丈夫なのですが。オンラインゲームとかあるとエラーになるのです。
バックバッファーの方だと、いずれも真っ黒なんです。
引用返信 編集キー/
■33780 / inTopicNo.7)  Re[2]: 画面のキャプチャ
□投稿者/ オショウ (113回)-(2009/03/09(Mon) 19:03:42)
>   http://vision.kuee.kyoto-u.ac.jp/~nob/doc/csharp/csharp.html#doc1_218

  すいません!
  CE/WindowsMobile/PocketPC 用ですネ!

  一般Windowsでは、真っ黒〜・・・

  ですが、掲載された当初のソースコードでは、エラーしません・・・
  ちゃんと取れました!

  しかしながら・・・
  デスクトップのハンドルを、WindowsMediaPlayerで表示した画面の
  ハンドルにしても、デスクトップの領域すべてになりますネ〜

  その辺に何か問題があるみたいです。

以上。参考まで・・・
引用返信 編集キー/
■33785 / inTopicNo.8)  Re[3]: 画面のキャプチャ
□投稿者/ オショウ (114回)-(2009/03/09(Mon) 20:33:26)
>   しかしながら・・・
>   デスクトップのハンドルを、WindowsMediaPlayerで表示した画面の
>   ハンドルにしても、デスクトップの領域すべてになりますネ〜
>
>   その辺に何か問題があるみたいです。

  再度、実験してみました。

  WindowsMediaPlayerの動画表示領域をSPY++でウィンドウハンドルを調べ
  そのハンドルを渡し、尚且つ、GetWindowRectで領域情報を取得して、
  BMPも領域サイズに合わせて生成し・・・BitBltしたら、正しくハンドル
  で指定された領域が静止画で保存できました。

  因みに、動画再生中でも、キャプチャした瞬間の静止画が保存できました。

  さて・・・何が問題でエラーするのか・・・

● ゲームの場合、DirectXを使っていても、設定が違うのではないでしょうか?

  Surfaceが正しく取れないので、エラーする・・・とか。

  当方ゲーム関係しないもので、テスト不能です。あしからず。

以上。
引用返信 編集キー/
■33858 / inTopicNo.9)  Re[4]: 画面のキャプチャ
□投稿者/ 山崎 (4回)-(2009/03/11(Wed) 17:33:10)
No33785 (オショウ さん) に返信
オショウさん、付き合っていただいてありがとうございます。

http://greenshot.sourceforge.net/

こちらのソースを見て別な方法で解決いたしました。

掲示板を利用させてもらい、ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -