/// <summary> /// InternetExplorerのページ全体をキャプチャします。 /// </summary> /// <param name="handle">ウィンドウハンドル</param> /// <returns>ビットマップ</returns> private Bitmap InternetExplorerCapture(IntPtr handle) { var isScrollWindowPageTop = Settings.General.IsWebPageCaptureStartWhenPageFirstMove.Value; var scrollDelayTime = Settings.General.ScrollDelayTime.Value; var fixHeaderHeight = Settings.General.FixHeaderHeight.Value; using (InternetExplorer ie = new InternetExplorer(handle, scrollDelayTime)) { // DPI取得 var dpi = PerMonitorDpi.GetDpi(handle); // クライアント領域、スクロール位置、スクロールサイズの取得 Rectangle client = ie.Client; Point scrollPoint = ie.ScrollPoint; Size scrollSize = ie.ScrollSize; // ページ先頭移動フラグが設定されている場合、スクロール位置をページ先頭に設定する if (isScrollWindowPageTop) { scrollPoint = ie.ScrollTo(0, 0); } // 出力先のビットマップ生成 // クライアント領域の幅 x (スクロール領域の高さ - スクロール位置Y) var bmpWidth = (int)((scrollSize.Width - scrollPoint.X) * dpi.ScaleX); var bmpHeight = (int)((scrollSize.Height - scrollPoint.Y) * dpi.ScaleY); Bitmap bmp = new Bitmap(bmpWidth, bmpHeight - (bmpHeight / client.Height - 1) * fixHeaderHeight); Debug.WriteLine($"BitmapHeight:{(int)((scrollSize.Height - scrollPoint.Y) * dpi.ScaleY)}"); Debug.WriteLine($"ClientHeight:{client.Height}"); Debug.WriteLine($"FixHeaderHeight:{fixHeaderHeight}"); using (Graphics g = Graphics.FromImage(bmp)) { // スクロール開始/終端座標を求める // ※終了座標はマージン前の高さで求める Point scrollStart = new Point(scrollPoint.X, scrollPoint.Y); Point scrollEnd = new Point(Math.Max(scrollSize.Width - client.Width, 0), Math.Max(scrollSize.Height - client.Height, 0)); // 右終端までスクロールしながらキャプチャする CaptureControl(handle, g, ref client, ref scrollPoint, ref scrollStart, dpi); while (scrollPoint.X < scrollEnd.X) { // スクロールしてキャプチャする scrollPoint = ie.ScrollTo(scrollPoint.X + client.Width, scrollPoint.Y); CaptureControl(handle, g, ref client, ref scrollPoint, ref scrollStart, dpi); } // 先頭行以降は固定ヘッダーを除外してキャプチャする client.Y += fixHeaderHeight; client.Height -= fixHeaderHeight; // 終端までスクロールしながらキャプチャする bool isFirst = true; int prevScrollY = -1; while (scrollPoint.Y < scrollEnd.Y && prevScrollY != scrollPoint.Y) { prevScrollY = scrollPoint.Y; // スクロールしてキャプチャする scrollPoint.X = scrollStart.X; scrollPoint = ie.ScrollTo(scrollPoint.X, scrollPoint.Y + client.Height); CaptureControl(handle, g, ref client, ref scrollPoint, ref scrollStart, dpi, (isFirst ? fixHeaderHeight : 0)); isFirst = false; // 右端までスクロールしながらキャプチャする while (scrollPoint.X < scrollEnd.X) { // スクロールしてウィンドウキャプチャする scrollPoint = ie.ScrollTo(scrollPoint.X + client.Width, scrollPoint.Y); CaptureControl(handle, g, ref client, ref scrollPoint, ref scrollStart, dpi); } } } return(bmp); } }