Example #1
0
        /// <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);
            }
        }