/// <summary> /// スクリーンショットを保存します。 /// </summary> /// <param name="path">保存先。</param> /// <param name="format">画像のフォーマット。</param> private void SaveScreenShot( string path, System.Drawing.Imaging.ImageFormat format ) { var wb = Browser; if ( !IsKanColleLoaded ) { AddLog( 3, string.Format( "艦これが読み込まれていないため、スクリーンショットを撮ることはできません。" ) ); return; } try { IViewObject viewobj = null; //int width = 0, height = 0; if ( wb.Document.Url.ToString().Contains( ".swf?" ) ) { viewobj = wb.Document.GetElementsByTagName( "embed" )[0].DomElement as IViewObject; if ( viewobj == null ) { throw new InvalidOperationException( "embed 要素の取得に失敗しました。" ); } //width = ( (HTMLEmbed)viewobj ).clientWidth; //height = ( (HTMLEmbed)viewobj ).clientHeight; } else { var swf = getFrameElementById( wb.Document, "externalswf" ); if ( swf == null ) { throw new InvalidOperationException( "対象の swf が見つかりませんでした。" ); } Func<dynamic, bool> isvalid = target => { if ( target == null ) return false; viewobj = target as IViewObject; if ( viewobj == null ) return false; //if ( !int.TryParse( target.width, out width ) ) return false; //if ( !int.TryParse( target.height, out height ) ) return false; return true; }; if ( !isvalid( swf.DomElement as HTMLEmbed ) && !isvalid( swf.DomElement as HTMLObjectElement ) ) { throw new InvalidOperationException( "対象の swf が見つかりませんでした。" ); } } if ( viewobj != null ) { var rect = new RECT { left = 0, top = 0, width = KanColleSize.Width, height = KanColleSize.Height }; using ( var image = new Bitmap( rect.width, rect.height, System.Drawing.Imaging.PixelFormat.Format24bppRgb ) ) { var device = new DVTARGETDEVICE { tdSize = 0 }; using ( var g = Graphics.FromImage( image ) ) { var hdc = g.GetHdc(); viewobj.Draw( 1, 0, IntPtr.Zero, device, IntPtr.Zero, hdc, rect, null, IntPtr.Zero, IntPtr.Zero ); g.ReleaseHdc( hdc ); } image.Save( path, format ); } } AddLog( 2, string.Format( "スクリーンショットを {0} に保存しました。", path ) ); } catch ( Exception ex ) { BrowserHost.AsyncRemoteRun( () => BrowserHost.Proxy.SendErrorReport( ex.ToString(), "スクリーンショットの保存時にエラーが発生しました。" ) ); } }
/// <summary> /// スクリーンショットを保存します。 /// </summary> /// <param name="path">保存先。</param> /// <param name="format">画像のフォーマット。</param> private void SaveScreenShot(string path, System.Drawing.Imaging.ImageFormat format) { var wb = Browser; if (!IsKanColleLoaded) { AddLog(3, string.Format(Resources.NoScreenshotUnloaded)); return; } try { IViewObject viewobj = null; //int width = 0, height = 0; if (wb.Document.Url.AbsolutePath.Contains(".swf")) { viewobj = wb.Document.GetElementsByTagName("embed")[0].DomElement as IViewObject; if (viewobj == null) { throw new InvalidOperationException(Resources.CouldntLoadEmbed); } //width = ( (HTMLEmbed)viewobj ).clientWidth; //height = ( (HTMLEmbed)viewobj ).clientHeight; } else { var swf = getFrameElementById(wb.Document, "externalswf"); if (swf == null) { throw new InvalidOperationException(Resources.CouldntFindSWF); } Func <dynamic, bool> isvalid = target => { if (target == null) { return(false); } viewobj = target as IViewObject; if (viewobj == null) { return(false); } //if ( !int.TryParse( target.width, out width ) ) return false; //if ( !int.TryParse( target.height, out height ) ) return false; return(true); }; if (!isvalid(swf.DomElement as HTMLEmbed) && !isvalid(swf.DomElement as HTMLObjectElement)) { throw new InvalidOperationException(Resources.CouldntFindSWF); } } if (viewobj != null) { var rect = new RECT { left = 0, top = 0, width = KanColleSize.Width, height = KanColleSize.Height }; using (var image = new Bitmap(rect.width, rect.height, System.Drawing.Imaging.PixelFormat.Format24bppRgb)) { var device = new DVTARGETDEVICE { tdSize = 0 }; using (var g = Graphics.FromImage(image)) { var hdc = g.GetHdc(); viewobj.Draw(1, 0, IntPtr.Zero, device, IntPtr.Zero, hdc, rect, null, IntPtr.Zero, IntPtr.Zero); g.ReleaseHdc(hdc); } image.Save(path, format); } } AddLog(2, string.Format(Resources.ScreenshotSaved, path)); } catch (Exception ex) { BrowserHost.AsyncRemoteRun(() => BrowserHost.Proxy.SendErrorReport(ex.ToString(), Resources.ScreenshotError)); } }
/// <summary> /// スクリーンショットを撮影します。 /// </summary> /// <param name="is32bpp"></param> /// <returns></returns> private Bitmap TakeScreenShot(bool is32bpp) { var wb = Browser; if (!IsKanColleLoaded) { AddLog(3, string.Format("艦これが読み込まれていないため、スクリーンショットを撮ることはできません。")); System.Media.SystemSounds.Beep.Play(); return(null); } try { IViewObject viewobj = null; //int width = 0, height = 0; if (wb.Document.Url.ToString().Contains(".swf?")) { viewobj = wb.Document.GetElementsByTagName("embed")[0].DomElement as IViewObject; if (viewobj == null) { throw new InvalidOperationException("embed 要素の取得に失敗しました。"); } //width = ( (HTMLEmbed)viewobj ).clientWidth; //height = ( (HTMLEmbed)viewobj ).clientHeight; } else { var swf = getFrameElementById(wb.Document, "externalswf"); if (swf == null) { throw new InvalidOperationException("対象の swf が見つかりませんでした。"); } Func <dynamic, bool> isvalid = target => { if (target == null) { return(false); } viewobj = target as IViewObject; if (viewobj == null) { return(false); } //if ( !int.TryParse( target.width, out width ) ) return false; //if ( !int.TryParse( target.height, out height ) ) return false; return(true); }; if (!isvalid(swf.DomElement as HTMLEmbed) && !isvalid(swf.DomElement as HTMLObjectElement)) { throw new InvalidOperationException("対象の swf が見つかりませんでした。"); } } if (viewobj != null) { var rect = new RECT { left = 0, top = 0, width = KanColleSize.Width, height = KanColleSize.Height }; // twitter の劣化回避を行う場合は32ビットの色深度で作業する var image = new Bitmap(rect.width, rect.height, is32bpp ? PixelFormat.Format32bppArgb : PixelFormat.Format24bppRgb); var device = new DVTARGETDEVICE { tdSize = 0 }; using (var g = Graphics.FromImage(image)) { var hdc = g.GetHdc(); viewobj.Draw(1, 0, IntPtr.Zero, device, IntPtr.Zero, hdc, rect, null, IntPtr.Zero, IntPtr.Zero); g.ReleaseHdc(hdc); } if (is32bpp) { // 不透明ピクセルのみだと jpeg 化されてしまうため、1px だけわずかに透明にする Color temp = image.GetPixel(image.Width - 1, image.Height - 1); image.SetPixel(image.Width - 1, image.Height - 1, Color.FromArgb(252, temp.R, temp.G, temp.B)); } return(image); } } catch (Exception ex) { SendErrorReport(ex.ToString(), "スクリーンショットの撮影時にエラーが発生しました。"); System.Media.SystemSounds.Beep.Play(); } return(null); }
/// <summary> /// スクリーンショットを保存します。 /// </summary> /// <param name="path">保存先。</param> /// <param name="format">画像のフォーマット。</param> private void SaveScreenShot(string path, System.Drawing.Imaging.ImageFormat format) { var wb = Browser; if (!IsKanColleLoaded) { AddLog(3, string.Format("艦これが読み込まれていないため、スクリーンショットを撮ることはできません。")); System.Media.SystemSounds.Beep.Play(); return; } try { IViewObject viewobj = null; //int width = 0, height = 0; if (wb.Document.Url.ToString().Contains(".swf?")) { viewobj = wb.Document.GetElementsByTagName("embed")[0].DomElement as IViewObject; if (viewobj == null) { throw new InvalidOperationException("embed 要素の取得に失敗しました。"); } //width = ( (HTMLEmbed)viewobj ).clientWidth; //height = ( (HTMLEmbed)viewobj ).clientHeight; } else { var swf = getFrameElementById(wb.Document, "externalswf"); if (swf == null) { throw new InvalidOperationException("対象の swf が見つかりませんでした。"); } Func <dynamic, bool> isvalid = target => { if (target == null) { return(false); } viewobj = target as IViewObject; if (viewobj == null) { return(false); } //if ( !int.TryParse( target.width, out width ) ) return false; //if ( !int.TryParse( target.height, out height ) ) return false; return(true); }; if (!isvalid(swf.DomElement as HTMLEmbed) && !isvalid(swf.DomElement as HTMLObjectElement)) { throw new InvalidOperationException("対象の swf が見つかりませんでした。"); } } if (viewobj != null) { var rect = new RECT { left = 0, top = 0, width = KanColleSize.Width, height = KanColleSize.Height }; using (var image = new Bitmap(rect.width, rect.height, System.Drawing.Imaging.PixelFormat.Format24bppRgb)) { var device = new DVTARGETDEVICE { tdSize = 0 }; using (var g = Graphics.FromImage(image)) { var hdc = g.GetHdc(); viewobj.Draw(1, 0, IntPtr.Zero, device, IntPtr.Zero, hdc, rect, null, IntPtr.Zero, IntPtr.Zero); g.ReleaseHdc(hdc); } image.Save(path, format); } } _lastScreenShotPath = path; AddLog(2, string.Format("スクリーンショットを {0} に保存しました。", path)); } catch (Exception ex) { BrowserHost.AsyncRemoteRun(() => BrowserHost.Proxy.SendErrorReport(ex.ToString(), "スクリーンショットの保存時にエラーが発生しました。")); System.Media.SystemSounds.Beep.Play(); } }
/// <summary> /// スクリーンショットを保存します。 /// </summary> /// <param name="path">保存先。</param> /// <param name="format">画像のフォーマット。</param> private void SaveScreenShot(string path, System.Drawing.Imaging.ImageFormat format) { var wb = Browser; if (!IsKanColleLoaded) { AddLog(3, string.Format("艦これが読み込まれていないため、スクリーンショットを撮ることはできません。")); return; } try { var document = wb.Document.DomDocument as HTMLDocument; if (document == null) { throw new InvalidOperationException("Document が取得できませんでした。"); } IViewObject viewobj = null; int width = 0, height = 0; if (document.url.Contains(".swf?")) { viewobj = document.getElementsByTagName("embed").item(0, 0) as IViewObject; if (viewobj == null) { throw new InvalidOperationException("embed 要素の取得に失敗しました。"); } width = ((HTMLEmbed)viewobj).clientWidth; height = ((HTMLEmbed)viewobj).clientHeight; } else { var gameFrame = document.getElementById("game_frame").document as HTMLDocument; if (gameFrame == null) { throw new InvalidOperationException("game_frame 要素の取得に失敗しました。"); } bool foundflag = false; for (int i = 0; i < document.frames.length; i++) { var provider = document.frames.item(i) as IServiceProvider; if (provider == null) { continue; } object ppvobj; provider.QueryService(typeof(SHDocVw.IWebBrowserApp).GUID, typeof(SHDocVw.IWebBrowser2).GUID, out ppvobj); var _wb = ppvobj as SHDocVw.IWebBrowser2; if (_wb == null) { continue; } var iframe = _wb.Document as HTMLDocument; if (iframe == null) { continue; } var swf = iframe.getElementById("externalswf"); if (swf == null) { continue; } Func <dynamic, bool> isvalid = target => { if (target == null) { return(false); } viewobj = target as IViewObject; if (viewobj == null) { return(false); } if (!int.TryParse(target.width, out width)) { return(false); } if (!int.TryParse(target.height, out height)) { return(false); } return(true); }; if (!isvalid(swf as HTMLEmbed) && !isvalid(swf as HTMLObjectElement)) { continue; } foundflag = true; break; } if (!foundflag) { throw new InvalidOperationException("対象の swf が見つかりませんでした。"); } } if (viewobj != null) { using (var image = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb)) { var rect = new RECT { left = 0, top = 0, width = width, height = height }; var device = new DVTARGETDEVICE { tdSize = 0 }; using (var g = Graphics.FromImage(image)) { var hdc = g.GetHdc(); viewobj.Draw(1, 0, IntPtr.Zero, device, IntPtr.Zero, hdc, rect, null, IntPtr.Zero, IntPtr.Zero); g.ReleaseHdc(hdc); } image.Save(path, format); } } AddLog(2, string.Format("スクリーンショットを {0} に保存しました。", path)); } catch (Exception ex) { BrowserHost.AsyncRemoteRun(() => BrowserHost.Proxy.SendErrorReport(ex.ToString(), "スクリーンショットの保存時にエラーが発生しました。")); } }