|
このようなソースをTimerイベントの中に入れてアクティブウインドウのスクリーンショットを取ってみました。
しかし、中には一部しか取れていなかったり画面が真っ暗だったりする画面があります。
やはりこのようなものを実装するためにはグローバルフックを利用しないとだめなのでしょうか。
private void timerPrint_Tick(object sender, EventArgs e)
{
IntPtr nPtrHandle = GetForegroundWindow();
if (intPtrNow.Equals(nPtrHandle) == false)
{
PrintCapture();
intPtrNow = nPtrHandle;
}
//MessageBox.Show("待機テスト");
}
private void PrintCapture(IntPtr nPtrHandle)
{
RECT r;
GetWindowRect(nPtrHandle, out r);
Rectangle rect = new Rectangle(r.left, r.top, r.right - r.left, r.bottom - r.top);
StringBuilder sb = new StringBuilder(100);
Bitmap img = new Bitmap(rect.Width, rect.Height); //後で変更
Graphics memg = Graphics.FromImage(img);
IntPtr dc = memg.GetHdc();
PrintWindow(nPtrHandle, dc, 0);
memg.ReleaseHdc(dc);
memg.Dispose();
this.BackgroundImage = img;
GetWindowText(nPtrHandle, sb, sb.Capacity - 4);
string strExseption = ".jpg";
StringBuilder sbFile = new StringBuilder();
int nCounter = 0;
sbFile.Append(sb.ToString());
sbFile.Append(strExseption);
while(File.Exists(sbFile.ToString()))
{
nCounter++;
sbFile.Clear();
sbFile.Append(sb.ToString());
sbFile.Append(nCounter);
sbFile.Append(strExseption);
}
img.Save(sb.ToString(), System.Drawing.Imaging.ImageFormat.Png);
}
|