[c#] C#でWindowsストアアプリケーションのウィンドウコンテンツをキャプチャする方法


Answers

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

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);
    }
}
Question

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

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

また、実行中のプログラムのアイコンの上にタスクバーを置くと、オフスクリーンコンポーネントを含むウィンドウの完全な高さが表示されるAero Peek機能が、Windows APIで何らかの形で可能でなければならないことがわかっています。 (右の背の高いウィンドウを参照してください、私のディスプレイよりはるかに高い6000pxに設定してください)




Related