/// <summary> /// アクティブウィンドウのキャプチャを行う /// </summary> /// <param name="targetWindowSizePoint"> /// キャプチャ対象となるアクティブウィンドウのサイズ位置情報を返却 /// </param> /// <exception cref="PlatformInvokeException"> /// Win32Apiの処理において、処理の呼び出しに失敗した場合に発生 /// </exception> /// <exception cref="Win32OperateException"> /// Win32Apiの処理において、処理に失敗した場合に発生 /// </exception> /// <exception cref="Win32Exception"> /// キャプチャデータ取得に用いる <see cref="Graphics.CopyFromScreen(Point, Point, Size, CopyPixelOperation)"/> /// において、Win32Apiの操作に失敗した場合に発生 /// </exception> /// <exception cref="Exception"> /// キャプチャデータを格納する <see cref="Bitmap"/> オブジェクトが生成できない場合に発生 /// </exception> /// <returns> /// アクティブウィンドウをキャプチャした画像データ /// (キャプチャできない場合は NULL を返却) /// </returns> private static Bitmap ActiveWindowCapture(out SizePoint targetWindowSizePoint) { // アクティブウィンドウのサイズと位置を取得 SizePoint windowSizePoint = null; IntPtr windowHandle = WindowOperate.GetForegroundWindowHandle(); if (windowHandle != IntPtr.Zero) { // ウィンドウハンドルが取得できた場合、 // ウィンドウサイズ位置、クライアント領域のサイズ位置を取得 HandleRef handle = new HandleRef(0, windowHandle); SizePoint window = WindowOperate.GetWindowRect(handle); SizePoint client = WindowOperate.GetClientRect(handle); // ウィンドウ全体とクライアント領域のサイズ差から、 // 左右下のバーの幅を取得し全体のサイズ位置を補正する if (window != null && client != null) { float barWidth = (window.SizeWidth - client.SizeWidth) / 2; windowSizePoint = new SizePoint( sizeWidth: window.SizeWidth - (int)(barWidth * 2), sizeHeight: window.SizeHeight - (int)Math.Floor(barWidth + 1), positionX: window.PositionX + (int)Math.Floor(barWidth), positionY: window.PositionY + 1); } } // ウィンドウサイズが取得できない場合はディスクトップのサイズ位置を取得する if (windowSizePoint == null) { HandleRef handle = new HandleRef(0, WindowOperate.GetDesktopWindow()); windowSizePoint = WindowOperate.GetWindowRect(handle); } // 上記ウィンドウの存在するScreenを取得 Screen screen; if (windowSizePoint != null) { screen = Screen.FromPoint(windowSizePoint.Point); } else { // ウィンドウサイズが取得できない場合は // プライマリウィンドウの情報からディスクトップのウィンドウサイズを設定する screen = Screen.PrimaryScreen; windowSizePoint = new SizePoint(screen.Bounds.Size, screen.Bounds.Location); } // ディスクトップの対象領域のキャプチャを取得 Bitmap captureImage = DesktopWindowCapture( windowSizePoint, screen, out SizePoint displayedSizePoint); // ウィンドウのサイズ位置 及び、画面情報、画像を返却 targetWindowSizePoint = displayedSizePoint; return(captureImage); }
/// <summary> /// この機能を使用して起動したChromeを閉じる /// </summary> /// <exception cref="PlatformInvokeException"> /// <see cref="WindowOperate"/> クラスのWin32Apiの処理において、処理の呼び出しに失敗した場合に発生 /// </exception> /// <exception cref="Win32OperateException"> /// <see cref="WindowOperate"/> クラスのWin32Apiの処理において、処理に失敗した場合に発生 /// </exception> /// <returns> /// 閉じたChromeのサイズ位置の情報 /// サイズ位置の情報が取得できない場合はNULLを返却 /// </returns> public static SizePoint Close() { // 閉じたChromeのサイズ位置の情報の変数を宣言 SizePoint sizePoint = null; // Chromeの音声認識が起動しているかチェック if (ChromeProcessInfoKey.HasValue) { // 閉じるChromeのウィンドウサイズ位置情報を取得 foreach (ProcessInfo info in StartProcess.StartProcessList) { // 起動したChromeのウィンドウハンドルを取得しサイズ位置情報を取得する if (info.StartNumId == ChromeProcessInfoKey.Value && info.HasWindowInfo) { sizePoint = WindowOperate.GetWindowRect(info.WindowInfo.WindowHandle); } // サイズ位置情報が取得できた場合、ループを抜ける if (sizePoint != null) { break; } } // 起動している場合、対象のChromeを閉じる StartProcess.CloseWindow(ChromeProcessInfoKey.Value); ChromeProcessInfoKey = null; } // ローカルHTTPサーバが起動しているかチェック if (Server != null) { // 起動している場合は停止する Server.Stop(); Server = null; } // 取得したサイズ位置情報を返却 return(sizePoint); }