言語は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としました。
※上記処理では、例外処理を省いています。