public Point GetWindowPoint(Rectangle rectangle = default(Rectangle)) { // ウィンドウが最小化されていた場合、もとに戻す // (ウィンドウが最小化されていると座標を取得できないから) this.Restore(); // ウィンドウを最前面に表示する(アクティブにはしない) this.BringWindowToTopWithoutActivation(); // クライアント領域の左上のスクリーン座標を取得 NativeCall.POINT screenPoint = new NativeCall.POINT(0, 0); NativeCall.ClientToScreen(this.handle, out screenPoint); // キャプチャ領域を取得 NativeCall.RECT clientRect = new NativeCall.RECT(); NativeCall.GetClientRect(this.handle, out clientRect); if (rectangle == default(Rectangle)) { rectangle = new Rectangle( clientRect.left, clientRect.top, clientRect.right - clientRect.left, clientRect.bottom - clientRect.top ); } Point captureStartPoint = new Point( screenPoint.X + rectangle.X, screenPoint.Y + rectangle.Y ); return(captureStartPoint); }
/// <summary> /// ウィドウが最小化されている場合、元に戻す /// </summary> public void Restore() { if (NativeCall.IsIconic(this.handle)) { NativeCall.ShowWindow(this.handle, NativeCall.WindowShowStyle.Restore); } }
/// <summary> /// 指定したウィンドウをアクティブにせずに最前面に表示する /// </summary> /// <param name="windowHandle"></param> public void BringWindowToTopWithoutActivation() { NativeCall.SetWindowPos(this.handle, (IntPtr)NativeCall.SpecialWindowHandles.HWND_TOP, 0, 0, 0, 0, NativeCall.SetWindowPosFlags.SWP_NOACTIVATE | NativeCall.SetWindowPosFlags.SWP_NOMOVE | NativeCall.SetWindowPosFlags.SWP_NOSIZE | NativeCall.SetWindowPosFlags.SWP_NOSENDCHANGING | NativeCall.SetWindowPosFlags.SWP_SHOWWINDOW ); }
/// <summary> /// クライアント領域を画像としてキャプチャする /// </summary> /// <param name="rectangle">クライアント領域内のキャプチャしたい領域。指定しない場合はクライアント領域全体をキャプチャする。</param> /// <returns>キャプチャした画像データ</returns> public Bitmap CaptureImage(Rectangle rectangle = default(Rectangle)) { // ウィンドウが最小化されていた場合、もとに戻す // (ウィンドウが最小化されていると座標を取得できないから) this.Restore(); // ウィンドウを最前面に表示する(アクティブにはしない) this.BringWindowToTopWithoutActivation(); // クライアント領域の左上のスクリーン座標を取得 NativeCall.POINT screenPoint = new NativeCall.POINT(0, 0); NativeCall.ClientToScreen(this.handle, out screenPoint); // キャプチャ領域を取得 NativeCall.RECT clientRect = new NativeCall.RECT(); NativeCall.GetClientRect(this.handle, out clientRect); if (rectangle == default(Rectangle)) { rectangle = new Rectangle( clientRect.left, clientRect.top, clientRect.right - clientRect.left, clientRect.bottom - clientRect.top ); } Point captureStartPoint = new Point( screenPoint.X + rectangle.X, screenPoint.Y + rectangle.Y ); // キャプチャ実行 Bitmap bitmap = new Bitmap(rectangle.Width, rectangle.Height); Graphics graphics = Graphics.FromImage(bitmap); using (graphics) { graphics.CopyFromScreen(captureStartPoint, new Point(0, 0), rectangle.Size); } return(bitmap); }