2016-06-20 11 views
26

Windowsのデスクトップアプリケーションのコンテンツをキャプチャし、.NETのビットマップオブジェクトに保存するためのコードが少しあります。それはUser32.dllとGdi32.dll(BitBlt)を使用し、正常に動作します。しかし、コードでは、Windowsストアアプリケーションを保持するウィンドウにコードを渡すと、すべて黒のビットマップが生成されます。これがセキュリティ機能なのかどうか分かりません。私はScreenCapture APIを使用することはできません。サイズ変更後のウィンドウの内容は、ほとんど常に画面よりも大きく/大きくなります。 Windowsストアアプリのために、スクリーンよりも大きくても、誰かがウィンドウの内容をキャプチャする運がありましたか?C#のWindowsストアアプリケーションのウィンドウコンテンツをキャプチャする方法

編集:私は自分のプログラムではなく、別のプログラムのウィンドウをキャプチャしようとしています。私のプログラムは、.NET 4.6.1/C#のWindowsコンソールアプリケーションと見なすことができます

また、私はこれがWindows APIで何らかの形で可能でなければならないことを知っています。なぜならAero Peek機能は、実行中のプログラムのアイコンには、オフスクリーンコンポーネントを含むウィンドウの完全な高さが表示されます。 Windowsの8.1のよう

see tall window on right, set to 6000px much higher than my display

+0

私は理由恵みの重複としてクローズすることはできませんが、あなたが見てきた:[Windowsのストアアプリケーションの画面をキャプチャ](http://stackoverflow.com/questions/15883332/capture-screen-of -windows-store-app) –

+0

あなたはそのアプリを持っていますか?一般的なケースでは、アプリケーションにオフスクリーン部分がある場合、オフスクリーンが物理的にレンダリングできることを保証するものはありません。一般的なケースでは、画面上に表示されているものだけをキャプチャすることができます(graphics.CopyFromScreenなど)。 –

+0

いいえ、私はアプリを所有していません。私は.NET 4.6.1で書かれたコンソールアプリケーションからWindowsストアアプリケーションをキャプチャしようとしています。 – Richthofen

答えて

3

を(私のディスプレイよりもはるかに高い6000pxに設定され、右側の背の高い窓を参照してください)、あなたはビットマップに要素をレンダリングするためにWindows.UI.Xaml.Media.Imaging.RenderTargetBitmapを使用することができます。これまでの注意点がいくつかあります:

  1. あなたがいる限り、彼らはXAMLビジュアルツリー内にあり、VisibleないCollapsedからVisibilityセットを持っているとして、オフスクリーンである要素を取り込むことができます。
  2. ビデオのような要素はキャプチャされません。

は詳細についてはAPIを参照してください:

https://msdn.microsoft.com/library/windows/apps/xaml/windows.ui.xaml.media.imaging.rendertargetbitmap.aspx

+0

残念ながら、私はアプリケーションのXAMLツリーにアクセスできないため、RenderTargetBitmapを使用することはできません。キャプチャしようとしているアプリとは別のアプリからキャプチャを実行しています。 – Richthofen

+0

ああ..私が知る限り、これを行う方法はありません。私は別のアプリからウィンドウの内容をキャプチャしようとしていることを明確にするために質問を明確にします。幸運にも、これは可能ならば私にとっても面白いでしょう。 –

2

これはトリックを行う可能性があります。基本的には、アプリケーションへのウィンドウハンドルを取得し、アプリケーションのウィンドウの位置を把握するためのネイティブ関数を呼び出し、それらがグラフィックスクラスを行い、画面からコピーします。

class Program 
{ 
    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    public static extern IntPtr FindWindow(string strClassName, string strWindowName); 

    [DllImport("user32.dll")] 
    public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle); 

    public struct Rect 
    { 
     public int Left { get; set; } 
     public int Top { get; set; } 
     public int Right { get; set; } 
     public int Bottom { get; set; } 
    } 


    static void Main(string[] args) 
    { 
     /// Give this your app's process name. 
     Process[] processes = Process.GetProcessesByName("yourapp"); 
     Process lol = processes[0]; 
     IntPtr ptr = lol.MainWindowHandle; 
     Rect AppRect = new Rect(); 
     GetWindowRect(ptr, ref AppRect); 
     Rectangle rect = new Rectangle(AppRect.Left, AppRect.Top, (AppRect.Right - AppRect.Left), (AppRect.Bottom - AppRect.Top)); 
     Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); 
     Graphics g = Graphics.FromImage(bmp); 
     g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); 

     // make sure temp directory is there or it will throw. 
     bmp.Save(@"c:\temp\test.jpg", ImageFormat.Jpeg); 
    } 
} 
+0

これはおそらく画面コンテンツのみが必要な場合に有効です。しかし、私の場合、私のウィンドウは画面よりも大きくなっています(画面の高さ2000ピクセルですが、ウィンドウの高さ/内容は約6000ピクセルです)。 – Richthofen

+0

セレンのprintscreenに似ています(キャプチャしようとしているウィンドウはWebブラウザではありませんが)。ウィンドウコンテンツのバッファ全体を一度にキャプチャしたいと思います。 – Richthofen

+0

ああ、それを得た。だからあなたは実際にはスクロールする必要があるアプリケーションの内部のコンテンツが必要です、あなたはそれがイメージに抽出されることを望みます。 –

関連する問題