布団が俺を呼んでいる

丘山大一のぶろぐ

別プロセスの画面キャプチャをしたい

言語はC#。実態(実体)はWinAPI。

別プロセスの画面キャプチャを取得し、画像として保存したい。

今回の対象プロセスはskype(exe名はlync)です。
こんな感じで書きました。

        [System.Runtime.InteropServices.DllImport("User32.dll")]
        private extern static bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags);

        [System.Runtime.InteropServices.DllImport("User32.dll")]
        private static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);

        private const string FORMAT_TIME = "yyyyMMddhhmmss";

        private void SavePicture()
        {
                    //Skypeのハンドルの取得
                    var pLst = System.Diagnostics.Process.GetProcesses().Where(p => p.ProcessName == "lync").ToArray();
                    var handle = pLst.First().MainWindowHandle;
                    RECT rec = new RECT();
                    var size = GetClientRect(handle, out rec);
                    //画像処理
                    Bitmap img = new Bitmap(rec.Right - rec.Left, rec.Bottom);
                    Graphics memg = Graphics.FromImage(img);
                    IntPtr dc = memg.GetHdc();
                    PrintWindow(handle, dc, 0);
                    memg.ReleaseHdc(dc);
                    memg.Dispose();

                    DateTime dt = DateTime.Now;
                    img.Save($@".\DATA\{dt.ToString(FORMAT_TIME)}.png");
        }

上記の問題点

プロセス名で単純に取得しているため、skype上で別ウィンドウ(例えばIM)を開いたりすると、メインウィンドウではなくそちらがキャプチャされてしまいます。
自分の用途としては許容範囲なのでOKとしました。
※上記処理では、例外処理を省いています。


プログラミングWindows 第6版 上 (Microsoft Press)

新品価格
¥7,560から
(2016/4/7 18:54時点)

コメントを書く