blog.kur.jp

バイオリンと山、自転車をこよなく愛するkurのチラシの裏。たまには技術的なことを書いたりするかも知れません。

プログラムからウィンドウのスクリーンショットを撮る

プログラムから定期的に,ブラウザのスクリーンショットを撮る必要があったので,C#でさくっと作ってみた.

最初,WM_PRINTを投げようと頑張ってみたんだけど,どうもWM_PRINTは他のプロセスに対して使えないらしい.そこで,PrintWindow関数を使ってみた.

やってることは簡単で,下記の通り.

  1. 現在開いているウィンドウの中から,それっぽウィンドウを探す.
  2. そのウィンドウのサイズを取得する
  3. そのウィンドウ用のBitmapオブジェクトを用意して,PrintWindowを実行する
  4. Bitmapを保存する

需要はないと思うけど,ついでにソースコードも貼り付けておきます.変数名とか,結構適当です.あと,ソースコードがC#なのは,なぜかネット上にC#のサンプルコードが多いからです.普段使ってないんですが,結構楽な言語ですね.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Runtime.InteropServices; using System.Drawing; using System.Drawing.Imaging; namespace ConsoleApplication1 { struct RECT { public int left; public int top; public int right; public int bottom; } class Program { [DllImport("User32.dll")] public extern static bool PrintWindow(System.IntPtr hWnd, System.IntPtr dc, uint reservedFlag); [DllImport("User32.dll")] public extern static bool GetWindowRect(IntPtr hWnd, out RECT rect); static void Main(string[] args) { RECT rect; foreach (Process p in Process.GetProcesses()) { if (p.MainWindowHandle != IntPtr.Zero) { Console.WriteLine(p.ProcessName + " : " + p.MainWindowTitle); if (p.ProcessName == "firefox") { GetWindowRect(p.MainWindowHandle, out rect); Bitmap img = new Bitmap*1; Graphics memg = Graphics.FromImage(img); IntPtr dc = memg.GetHdc(); PrintWindow(p.MainWindowHandle, dc, 0); memg.ReleaseHdc(dc); memg.Dispose(); img.Save("aaaa.png"); } } } } } }

*1:rect.right - rect.left),(rect.bottom - rect.top