private void CaptureWithFeedback() { using (CaptureForm captureForm = new CaptureForm(capture, windows)) { DialogResult result = captureForm.ShowDialog(); if (result == DialogResult.OK) { selectedCaptureWindow = captureForm.SelectedCaptureWindow; captureRect = captureForm.CaptureRectangle; // Get title if (selectedCaptureWindow != null) { capture.CaptureDetails.Title = selectedCaptureWindow.Text; } // Experimental code if (capture.CaptureDetails.CaptureMode == CaptureMode.Video) { if (captureForm.UsedCaptureMode == CaptureMode.Window) { screenCapture = new ScreenCaptureHelper(selectedCaptureWindow); } else if (captureForm.UsedCaptureMode == CaptureMode.Region) { screenCapture = new ScreenCaptureHelper(captureRect); } if (screenCapture != null) { screenCapture.RecordMouse = capture.CursorVisible; if (screenCapture.Start(25)) { return; } // User clicked cancel or a problem occured screenCapture.Stop(); screenCapture = null; return; } } if (captureRect.Height > 0 && captureRect.Width > 0) { if (windowDetailsThread != null) { windowDetailsThread.Join(); } // Take the captureRect, this already is specified as bitmap coordinates capture.Crop(captureRect); // save for re-capturing later and show recapture context menu option RuntimeConfig.LastCapturedRegion = captureRect; HandleCapture(); } } } }
private void CaptureWithFeedback() { // The following, to be precise the HideApp, causes the app to close as described in BUG-1620 // Added check for metro (Modern UI) apps, which might be maximized and cover the screen. //foreach(WindowDetails app in WindowDetails.GetMetroApps()) { // if (app.Maximised) { // app.HideApp(); // } //} using (CaptureForm captureForm = new CaptureForm(_capture, _windows)) { // Make sure the form is hidden after showing, even if an exception occurs, so all errors will be shown DialogResult result; try { result = captureForm.ShowDialog(MainForm.Instance); } finally { captureForm.Hide(); } if (result == DialogResult.OK) { _selectedCaptureWindow = captureForm.SelectedCaptureWindow; _captureRect = captureForm.CaptureRectangle; // Get title if (_selectedCaptureWindow != null) { _capture.CaptureDetails.Title = _selectedCaptureWindow.Text; } if (_captureRect.Height > 0 && _captureRect.Width > 0) { // Take the captureRect, this already is specified as bitmap coordinates _capture.Crop(_captureRect); // save for re-capturing later and show recapture context menu option // Important here is that the location needs to be offsetted back to screen coordinates! Rectangle tmpRectangle = _captureRect; tmpRectangle.Offset(_capture.ScreenBounds.Location.X, _capture.ScreenBounds.Location.Y); CoreConfig.LastCapturedRegion = tmpRectangle; HandleCapture(); } } } }
/// <summary> /// Make Capture with specified destinations /// </summary> /// <param name="mode">CaptureMode</param> /// <param name="captureMouseCursor">bool false if the mouse should not be captured, true if the configuration should be checked</param> /// <param name="captureDestinations">List<CaptureDestination> with destinations</param> private void MakeCapture(CaptureMode mode, bool captureMouseCursor, ICapture newCapture) { if (screenCapture != null) { screenCapture.Stop(); screenCapture = null; return; } if (captureMode != CaptureMode.None) { LOG.Warn(String.Format("Capture started while capturing, current mode = {0} new capture was {1}.", captureMode, mode)); return; } else { LOG.Debug(String.Format("MakeCapture({0}, {1})", mode, captureMouseCursor)); } captureMode = mode; PrepareForCaptureWithFeedback(mode); // cleanup the previos information if there is still any if (capture != null) { LOG.Debug("Capture wasn't disposed yet, this would suggest a leak"); capture.Dispose(); capture = null; } // Use the supplied Capture information capture = newCapture; if (capture == null) { capture = new Capture(); } capture.CaptureDetails.CaptureMode = mode; // Workaround for proble with DPI retrieval, the FromHwnd activates the window... WindowDetails previouslyActiveWindow = WindowDetails.GetActiveWindow(); // Workaround for changed DPI settings in Windows 7 using (Graphics graphics = Graphics.FromHwnd(this.Handle)) { capture.CaptureDetails.DpiX = graphics.DpiX; capture.CaptureDetails.DpiY = graphics.DpiY; } if (previouslyActiveWindow != null) { // Set previouslyActiveWindow as foreground window previouslyActiveWindow.ToForeground(); } // Delay for the Context menu if (conf.CaptureDelay > 0) { System.Threading.Thread.Sleep(conf.CaptureDelay); } else { conf.CaptureDelay = 0; } // Allways capture Mousecursor, only show when needed capture = WindowCapture.CaptureCursor(capture); capture.CursorVisible = false; // Check if needed if (captureMouseCursor && mode != CaptureMode.Clipboard && mode != CaptureMode.File) { capture.CursorVisible = conf.CaptureMousepointer; } switch (mode) { case CaptureMode.Window: capture = WindowCapture.CaptureScreen(capture); capture.CaptureDetails.AddMetaData("source", "Screen"); CaptureWithFeedback(); break; case CaptureMode.ActiveWindow: if (CaptureActiveWindow()) { // Capture worked, offset mouse according to screen bounds and capture location capture.MoveMouseLocation(capture.ScreenBounds.Location.X - capture.Location.X, capture.ScreenBounds.Location.Y - capture.Location.Y); capture.CaptureDetails.AddMetaData("source", "Window"); } else { captureMode = CaptureMode.FullScreen; capture = WindowCapture.CaptureScreen(capture); capture.CaptureDetails.AddMetaData("source", "Screen"); capture.CaptureDetails.Title = "Screen"; } // Make sure capturing is stopped at any cost StopCapturing(false); HandleCapture(); break; case CaptureMode.IE: if (IECaptureHelper.CaptureIE(capture) != null) { capture.CaptureDetails.AddMetaData("source", "Internet Explorer"); HandleCapture(); } else { StopCapturing(true); } break; case CaptureMode.FullScreen: capture = WindowCapture.CaptureScreen(capture); HandleCapture(); break; case CaptureMode.Clipboard: Image clipboardImage = null; string text = "Clipboard"; if (ClipboardHelper.ContainsImage()) { clipboardImage = ClipboardHelper.GetImage(); } if (clipboardImage != null) { if (capture != null) { capture.Image = clipboardImage; } else { capture = new Capture(clipboardImage); } string title = ClipboardHelper.GetText(); if (title == null || title.Trim().Length == 0) { title = "Clipboard"; } capture.CaptureDetails.Title = title; capture.CaptureDetails.AddMetaData("source", "Clipboard"); // Force Editor capture.CaptureDetails.AddDestination(CaptureDestination.Editor); HandleCapture(); } else { MessageBox.Show("Couldn't create bitmap from : " + text); } break; case CaptureMode.File: Bitmap fileBitmap = null; bool isSaveSupported = true; string filename = capture.CaptureDetails.Filename; if (!string.IsNullOrEmpty(filename)) { try { fileBitmap = ImageHelper.LoadBitmap(filename, ref isSaveSupported); } catch (Exception e) { LOG.Error(e.Message, e); MessageBox.Show(lang.GetFormattedString(LangKey.error_openfile, filename)); } } if (fileBitmap != null) { capture.CaptureDetails.Title = Path.GetFileNameWithoutExtension(filename); capture.CaptureDetails.AddMetaData("file", filename); capture.CaptureDetails.AddMetaData("source", "file"); if (capture != null) { capture.Image = fileBitmap; } else { capture = new Capture(fileBitmap); } // Force Editor, this is currently the only usefull destination capture.CaptureDetails.AddDestination(CaptureDestination.Editor); if (!isSaveSupported) { // We can't save icon & wmf, don't supply the filename HandleCapture(); } else { HandleCapture(filename); } } else { // "semi" Fix for Bug #3430555 StopCapturing(true); } break; case CaptureMode.LastRegion: if (!RuntimeConfig.LastCapturedRegion.Equals(Rectangle.Empty)) { capture = WindowCapture.CaptureScreen(capture); capture.Crop(RuntimeConfig.LastCapturedRegion); capture.CaptureDetails.AddMetaData("source", "screen"); HandleCapture(); } else { // Fix for Bug #3430555 StopCapturing(true); } break; case CaptureMode.Region: capture = WindowCapture.CaptureScreen(capture); capture.CaptureDetails.AddMetaData("source", "screen"); CaptureWithFeedback(); break; case CaptureMode.Video: capture = WindowCapture.CaptureScreen(capture); // Set the capturemode to be window captureMode = CaptureMode.Window; capture.CaptureDetails.AddMetaData("source", "Video"); CaptureWithFeedback(); break; default: LOG.Warn("Unknown capture mode: " + mode); break; } }