ExecuteJob methods moved to TaskHelpers, Capture related methods moved to CaptureTaskHelpers

This commit is contained in:
Jaex 2016-10-31 23:55:12 +03:00
parent e2a6e5fba3
commit 6b5940a135
4 changed files with 573 additions and 536 deletions

View file

@ -0,0 +1,368 @@
#region License Information (GPL v3)
/*
ShareX - A program that allows you to take screenshots and share any file type
Copyright (c) 2007-2016 ShareX Team
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Optionally you can also view the license at <http://www.gnu.org/licenses/>.
*/
#endregion License Information (GPL v3)
using ShareX.HelpersLib;
using ShareX.ScreenCaptureLib;
using System;
using System.Diagnostics;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
namespace ShareX
{
public static class CaptureTaskHelpers
{
public delegate Image ScreenCaptureDelegate();
private enum LastRegionCaptureType { Default, Light, Transparent }
private static LastRegionCaptureType lastRegionCaptureType = LastRegionCaptureType.Default;
public static void CaptureScreenshot(CaptureType captureType, TaskSettings taskSettings = null, bool autoHideForm = true)
{
if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings();
switch (captureType)
{
case CaptureType.Fullscreen:
DoCapture(TaskHelpers.GetScreenshot(taskSettings).CaptureFullscreen, CaptureType.Fullscreen, taskSettings, autoHideForm);
break;
case CaptureType.ActiveWindow:
CaptureActiveWindow(taskSettings, autoHideForm);
break;
case CaptureType.ActiveMonitor:
DoCapture(TaskHelpers.GetScreenshot(taskSettings).CaptureActiveMonitor, CaptureType.ActiveMonitor, taskSettings, autoHideForm);
break;
case CaptureType.Region:
CaptureRegion(taskSettings, autoHideForm);
break;
case CaptureType.CustomRegion:
CaptureCustomRegion(taskSettings, autoHideForm);
break;
case CaptureType.LastRegion:
CaptureLastRegion(taskSettings, autoHideForm);
break;
}
}
public static void DoCapture(ScreenCaptureDelegate capture, CaptureType captureType, TaskSettings taskSettings = null, bool autoHideForm = true)
{
if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings();
if (taskSettings.CaptureSettings.IsDelayScreenshot && taskSettings.CaptureSettings.DelayScreenshot > 0)
{
TaskEx.Run(() =>
{
int sleep = (int)(taskSettings.CaptureSettings.DelayScreenshot * 1000);
Thread.Sleep(sleep);
},
() =>
{
DoCaptureWork(capture, captureType, taskSettings, autoHideForm);
});
}
else
{
DoCaptureWork(capture, captureType, taskSettings, autoHideForm);
}
}
private static void DoCaptureWork(ScreenCaptureDelegate capture, CaptureType captureType, TaskSettings taskSettings, bool autoHideForm = true)
{
if (autoHideForm)
{
Program.MainForm.Hide();
Thread.Sleep(250);
}
Image img = null;
try
{
img = capture();
}
catch (Exception ex)
{
DebugHelper.WriteException(ex);
}
finally
{
if (autoHideForm)
{
Program.MainForm.ForceActivate();
}
AfterCapture(img, captureType, taskSettings);
}
}
private static void AfterCapture(Image img, CaptureType captureType, TaskSettings taskSettings)
{
if (img != null)
{
if (taskSettings.GeneralSettings.PlaySoundAfterCapture)
{
TaskHelpers.PlayCaptureSound(taskSettings);
}
if (taskSettings.ImageSettings.ImageEffectOnlyRegionCapture && !IsRegionCapture(captureType))
{
taskSettings.AfterCaptureJob = taskSettings.AfterCaptureJob.Remove(AfterCaptureTasks.AddImageEffects);
}
UploadManager.RunImageTask(img, taskSettings);
}
}
private static bool IsRegionCapture(CaptureType captureType)
{
return captureType.HasFlagAny(CaptureType.Region, CaptureType.LastRegion);
}
public static void CaptureActiveWindow(TaskSettings taskSettings, bool autoHideForm = true)
{
DoCapture(() =>
{
Image img;
string activeWindowTitle = NativeMethods.GetForegroundWindowText();
string activeProcessName = null;
using (Process process = NativeMethods.GetForegroundWindowProcess())
{
if (process != null)
{
activeProcessName = process.ProcessName;
}
}
if (taskSettings.CaptureSettings.CaptureTransparent && !taskSettings.CaptureSettings.CaptureClientArea)
{
img = TaskHelpers.GetScreenshot(taskSettings).CaptureActiveWindowTransparent();
}
else
{
img = TaskHelpers.GetScreenshot(taskSettings).CaptureActiveWindow();
}
img.Tag = new ImageTag
{
WindowTitle = activeWindowTitle,
ProcessName = activeProcessName
};
return img;
}, CaptureType.ActiveWindow, taskSettings, autoHideForm);
}
public static void CaptureCustomRegion(TaskSettings taskSettings, bool autoHideForm)
{
DoCapture(() =>
{
Rectangle regionBounds = taskSettings.CaptureSettings.CaptureCustomRegion;
Image img = TaskHelpers.GetScreenshot(taskSettings).CaptureRectangle(regionBounds);
return img;
}, CaptureType.CustomRegion, taskSettings, autoHideForm);
}
public static void CaptureWindow(IntPtr handle, TaskSettings taskSettings = null, bool autoHideForm = true)
{
if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings();
autoHideForm = autoHideForm && handle != Program.MainForm.Handle;
DoCapture(() =>
{
if (NativeMethods.IsIconic(handle))
{
NativeMethods.RestoreWindow(handle);
}
NativeMethods.SetForegroundWindow(handle);
Thread.Sleep(250);
if (taskSettings.CaptureSettings.CaptureTransparent && !taskSettings.CaptureSettings.CaptureClientArea)
{
return TaskHelpers.GetScreenshot(taskSettings).CaptureWindowTransparent(handle);
}
return TaskHelpers.GetScreenshot(taskSettings).CaptureWindow(handle);
}, CaptureType.Window, taskSettings, autoHideForm);
}
public static void CaptureRegion(TaskSettings taskSettings, bool autoHideForm = true)
{
RegionCaptureForm form = new RegionCaptureForm(RegionCaptureMode.Annotation);
DoCapture(() =>
{
Image img = null;
try
{
form.Config = taskSettings.CaptureSettingsReference.SurfaceOptions;
form.Prepare(TaskHelpers.GetScreenshot(taskSettings).CaptureFullscreen());
form.ShowDialog();
img = form.GetResultImage();
if (img != null)
{
if (form.Result == RegionResult.Region && taskSettings.UploadSettings.RegionCaptureUseWindowPattern)
{
WindowInfo windowInfo = form.GetWindowInfo();
if (windowInfo != null)
{
img.Tag = new ImageTag
{
WindowTitle = windowInfo.Text,
ProcessName = windowInfo.ProcessName
};
}
}
lastRegionCaptureType = LastRegionCaptureType.Default;
}
}
finally
{
if (form != null)
{
form.Dispose();
}
}
return img;
}, CaptureType.Region, taskSettings, autoHideForm);
}
public static void CaptureRectangleLight(TaskSettings taskSettings = null, bool autoHideForm = true)
{
if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings();
DoCapture(() =>
{
Image img = null;
using (RegionCaptureLightForm rectangleLight = new RegionCaptureLightForm(TaskHelpers.GetScreenshot(taskSettings)))
{
if (rectangleLight.ShowDialog() == DialogResult.OK)
{
img = rectangleLight.GetAreaImage();
if (img != null)
{
lastRegionCaptureType = LastRegionCaptureType.Light;
}
}
}
return img;
}, CaptureType.Region, taskSettings, autoHideForm);
}
public static void CaptureRectangleTransparent(TaskSettings taskSettings = null, bool autoHideForm = true)
{
if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings();
DoCapture(() =>
{
Image img = null;
using (RegionCaptureTransparentForm rectangleTransparent = new RegionCaptureTransparentForm())
{
if (rectangleTransparent.ShowDialog() == DialogResult.OK)
{
img = rectangleTransparent.GetAreaImage(TaskHelpers.GetScreenshot(taskSettings));
if (img != null)
{
lastRegionCaptureType = LastRegionCaptureType.Transparent;
}
}
}
return img;
}, CaptureType.Region, taskSettings, autoHideForm);
}
public static void CaptureLastRegion(TaskSettings taskSettings, bool autoHideForm = true)
{
switch (lastRegionCaptureType)
{
case LastRegionCaptureType.Default:
if (RegionCaptureForm.LastRegionFillPath != null)
{
DoCapture(() =>
{
using (Image screenshot = TaskHelpers.GetScreenshot(taskSettings).CaptureFullscreen())
{
return RegionCaptureTasks.ApplyRegionPathToImage(screenshot, RegionCaptureForm.LastRegionFillPath);
}
}, CaptureType.LastRegion, taskSettings, autoHideForm);
}
else
{
CaptureRegion(taskSettings, autoHideForm);
}
break;
case LastRegionCaptureType.Light:
if (!RegionCaptureLightForm.LastSelectionRectangle0Based.IsEmpty)
{
DoCapture(() =>
{
using (Image screenshot = TaskHelpers.GetScreenshot(taskSettings).CaptureFullscreen())
{
return ImageHelpers.CropImage(screenshot, RegionCaptureLightForm.LastSelectionRectangle0Based);
}
}, CaptureType.LastRegion, taskSettings, autoHideForm);
}
else
{
CaptureRectangleLight(taskSettings, autoHideForm);
}
break;
case LastRegionCaptureType.Transparent:
if (!RegionCaptureTransparentForm.LastSelectionRectangle0Based.IsEmpty)
{
DoCapture(() =>
{
using (Image screenshot = TaskHelpers.GetScreenshot(taskSettings).CaptureFullscreen())
{
return ImageHelpers.CropImage(screenshot, RegionCaptureTransparentForm.LastSelectionRectangle0Based);
}
}, CaptureType.LastRegion, taskSettings, autoHideForm);
}
else
{
CaptureRectangleTransparent(taskSettings, autoHideForm);
}
break;
}
}
}
}

View file

@ -348,7 +348,7 @@ private ToolStripMenuItem WorkflowMenuItem(HotkeySettings hotkeySetting)
{
tsmi.Font = new Font(tsmi.Font, FontStyle.Bold);
}
tsmi.Click += (sender, e) => ExecuteJob(hotkeySetting.TaskSettings);
tsmi.Click += (sender, e) => TaskHelpers.ExecuteJob(hotkeySetting.TaskSettings);
return tsmi;
}
@ -721,7 +721,7 @@ private bool CheckCLIHotkey(CLICommand command)
{
if (command.CheckCommand(job.ToString()))
{
ExecuteJob(job, command);
TaskHelpers.ExecuteJob(job, command);
return true;
}
}
@ -739,7 +739,7 @@ private bool CheckCLIWorkflow(CLICommand command)
{
if (command.Parameter == hotkeySetting.TaskSettings.ToString())
{
ExecuteJob(hotkeySetting.TaskSettings);
TaskHelpers.ExecuteJob(hotkeySetting.TaskSettings);
return true;
}
}
@ -1387,7 +1387,7 @@ private void lblTips_Click(object sender, EventArgs e)
private void timerTraySingleClick_Tick(object sender, EventArgs e)
{
timerTraySingleClick.Stop();
ExecuteJob(Program.Settings.TrayLeftClickAction);
TaskHelpers.ExecuteJob(Program.Settings.TrayLeftClickAction);
}
private void niTray_MouseClick(object sender, MouseEventArgs e)
@ -1397,7 +1397,7 @@ private void niTray_MouseClick(object sender, MouseEventArgs e)
case MouseButtons.Left:
if (Program.Settings.TrayLeftDoubleClickAction == HotkeyType.None)
{
ExecuteJob(Program.Settings.TrayLeftClickAction);
TaskHelpers.ExecuteJob(Program.Settings.TrayLeftClickAction);
}
else
{
@ -1406,7 +1406,7 @@ private void niTray_MouseClick(object sender, MouseEventArgs e)
}
break;
case MouseButtons.Middle:
ExecuteJob(Program.Settings.TrayMiddleClickAction);
TaskHelpers.ExecuteJob(Program.Settings.TrayMiddleClickAction);
break;
}
}
@ -1416,7 +1416,7 @@ private void niTray_MouseDoubleClick(object sender, MouseEventArgs e)
if (e.Button == MouseButtons.Left)
{
timerTraySingleClick.Stop();
ExecuteJob(Program.Settings.TrayLeftDoubleClickAction);
TaskHelpers.ExecuteJob(Program.Settings.TrayLeftDoubleClickAction);
}
}
@ -1694,12 +1694,6 @@ private void tsmiImagePreviewAutomatic_Click(object sender, EventArgs e)
#region Hotkey/Capture codes and form events
private delegate Image ScreenCaptureDelegate();
private enum LastRegionCaptureType { Default, Light, Transparent }
private LastRegionCaptureType lastRegionCaptureType = LastRegionCaptureType.Default;
private void InitHotkeys()
{
TaskEx.Run(() =>
@ -1738,514 +1732,7 @@ private void HandleHotkeys(HotkeySettings hotkeySetting)
{
DebugHelper.WriteLine("Hotkey triggered. " + hotkeySetting);
if (hotkeySetting.TaskSettings.Job != HotkeyType.None)
{
ExecuteJob(hotkeySetting.TaskSettings);
}
}
private void ExecuteJob(HotkeyType job, CLICommand command = null)
{
ExecuteJob(Program.DefaultTaskSettings, job, command);
}
private void ExecuteJob(TaskSettings taskSettings)
{
ExecuteJob(taskSettings, taskSettings.Job);
}
private void ExecuteJob(TaskSettings taskSettings, HotkeyType job, CLICommand command = null)
{
DebugHelper.WriteLine("Executing: " + job.GetLocalizedDescription());
TaskSettings safeTaskSettings = TaskSettings.GetSafeTaskSettings(taskSettings);
switch (job)
{
// Upload
case HotkeyType.FileUpload:
UploadManager.UploadFile(safeTaskSettings);
break;
case HotkeyType.FolderUpload:
UploadManager.UploadFolder(safeTaskSettings);
break;
case HotkeyType.ClipboardUpload:
UploadManager.ClipboardUpload(safeTaskSettings);
break;
case HotkeyType.ClipboardUploadWithContentViewer:
UploadManager.ClipboardUploadWithContentViewer(safeTaskSettings);
break;
case HotkeyType.UploadURL:
UploadManager.UploadURL(safeTaskSettings);
break;
case HotkeyType.DragDropUpload:
TaskHelpers.OpenDropWindow(safeTaskSettings);
break;
case HotkeyType.StopUploads:
TaskManager.StopAllTasks();
break;
// Screen capture
case HotkeyType.PrintScreen:
CaptureScreenshot(CaptureType.Fullscreen, safeTaskSettings, false);
break;
case HotkeyType.ActiveWindow:
CaptureScreenshot(CaptureType.ActiveWindow, safeTaskSettings, false);
break;
case HotkeyType.ActiveMonitor:
CaptureScreenshot(CaptureType.ActiveMonitor, safeTaskSettings, false);
break;
case HotkeyType.RectangleRegion:
CaptureScreenshot(CaptureType.Region, safeTaskSettings, false);
break;
case HotkeyType.RectangleLight:
CaptureRectangleLight(safeTaskSettings, false);
break;
case HotkeyType.RectangleTransparent:
CaptureRectangleTransparent(safeTaskSettings, false);
break;
case HotkeyType.CustomRegion:
CaptureScreenshot(CaptureType.CustomRegion, safeTaskSettings, false);
break;
case HotkeyType.LastRegion:
CaptureScreenshot(CaptureType.LastRegion, safeTaskSettings, false);
break;
case HotkeyType.ScrollingCapture:
TaskHelpers.OpenScrollingCapture(safeTaskSettings, true);
break;
case HotkeyType.CaptureWebpage:
TaskHelpers.OpenWebpageCapture(safeTaskSettings);
break;
case HotkeyType.TextCapture:
TaskHelpers.OpenOCR(safeTaskSettings);
break;
case HotkeyType.AutoCapture:
TaskHelpers.OpenAutoCapture();
break;
case HotkeyType.StartAutoCapture:
TaskHelpers.StartAutoCapture();
break;
// Screen record
case HotkeyType.ScreenRecorder:
TaskHelpers.StartScreenRecording(ScreenRecordOutput.FFmpeg, ScreenRecordStartMethod.Region, safeTaskSettings);
break;
case HotkeyType.ScreenRecorderActiveWindow:
TaskHelpers.StartScreenRecording(ScreenRecordOutput.FFmpeg, ScreenRecordStartMethod.ActiveWindow, safeTaskSettings);
break;
case HotkeyType.ScreenRecorderCustomRegion:
TaskHelpers.StartScreenRecording(ScreenRecordOutput.FFmpeg, ScreenRecordStartMethod.CustomRegion, safeTaskSettings);
break;
case HotkeyType.StartScreenRecorder:
TaskHelpers.StartScreenRecording(ScreenRecordOutput.FFmpeg, ScreenRecordStartMethod.LastRegion, safeTaskSettings);
break;
case HotkeyType.ScreenRecorderGIF:
TaskHelpers.StartScreenRecording(ScreenRecordOutput.GIF, ScreenRecordStartMethod.Region, safeTaskSettings);
break;
case HotkeyType.ScreenRecorderGIFActiveWindow:
TaskHelpers.StartScreenRecording(ScreenRecordOutput.GIF, ScreenRecordStartMethod.ActiveWindow, safeTaskSettings);
break;
case HotkeyType.ScreenRecorderGIFCustomRegion:
TaskHelpers.StartScreenRecording(ScreenRecordOutput.GIF, ScreenRecordStartMethod.CustomRegion, safeTaskSettings);
break;
case HotkeyType.StartScreenRecorderGIF:
TaskHelpers.StartScreenRecording(ScreenRecordOutput.GIF, ScreenRecordStartMethod.LastRegion, safeTaskSettings);
break;
case HotkeyType.AbortScreenRecording:
TaskHelpers.AbortScreenRecording();
break;
// Tools
case HotkeyType.ColorPicker:
TaskHelpers.OpenColorPicker();
break;
case HotkeyType.ScreenColorPicker:
TaskHelpers.OpenScreenColorPicker(safeTaskSettings);
break;
case HotkeyType.ImageEditor:
if (command != null && !string.IsNullOrEmpty(command.Parameter) && File.Exists(command.Parameter))
{
TaskHelpers.AnnotateImage(command.Parameter, safeTaskSettings);
}
else
{
TaskHelpers.AnnotateImage(safeTaskSettings);
}
break;
case HotkeyType.ImageEffects:
TaskHelpers.OpenImageEffects();
break;
case HotkeyType.HashCheck:
TaskHelpers.OpenHashCheck();
break;
case HotkeyType.DNSChanger:
TaskHelpers.OpenDNSChanger();
break;
case HotkeyType.QRCode:
TaskHelpers.OpenQRCode();
break;
case HotkeyType.Ruler:
TaskHelpers.OpenRuler(safeTaskSettings);
break;
case HotkeyType.Automate:
TaskHelpers.StartAutomate();
break;
case HotkeyType.IndexFolder:
UploadManager.IndexFolder();
break;
case HotkeyType.ImageCombiner:
TaskHelpers.OpenImageCombiner(safeTaskSettings);
break;
case HotkeyType.VideoThumbnailer:
TaskHelpers.OpenVideoThumbnailer(safeTaskSettings);
break;
case HotkeyType.FTPClient:
TaskHelpers.OpenFTPClient();
break;
case HotkeyType.TweetMessage:
TaskHelpers.TweetMessage();
break;
case HotkeyType.MonitorTest:
TaskHelpers.OpenMonitorTest();
break;
// Other
case HotkeyType.DisableHotkeys:
TaskHelpers.ToggleHotkeys();
break;
case HotkeyType.OpenMainWindow:
this.ForceActivate();
break;
case HotkeyType.OpenScreenshotsFolder:
TaskHelpers.OpenScreenshotsFolder();
break;
case HotkeyType.OpenHistory:
TaskHelpers.OpenHistory();
break;
case HotkeyType.OpenImageHistory:
TaskHelpers.OpenImageHistory();
break;
}
}
public void CaptureScreenshot(CaptureType captureType, TaskSettings taskSettings = null, bool autoHideForm = true)
{
if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings();
switch (captureType)
{
case CaptureType.Fullscreen:
DoCapture(TaskHelpers.GetScreenshot(taskSettings).CaptureFullscreen, CaptureType.Fullscreen, taskSettings, autoHideForm);
break;
case CaptureType.ActiveWindow:
CaptureActiveWindow(taskSettings, autoHideForm);
break;
case CaptureType.ActiveMonitor:
DoCapture(TaskHelpers.GetScreenshot(taskSettings).CaptureActiveMonitor, CaptureType.ActiveMonitor, taskSettings, autoHideForm);
break;
case CaptureType.Region:
CaptureRegion(taskSettings, autoHideForm);
break;
case CaptureType.CustomRegion:
CaptureCustomRegion(taskSettings, autoHideForm);
break;
case CaptureType.LastRegion:
CaptureLastRegion(taskSettings, autoHideForm);
break;
}
}
private void DoCapture(ScreenCaptureDelegate capture, CaptureType captureType, TaskSettings taskSettings = null, bool autoHideForm = true)
{
if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings();
if (taskSettings.CaptureSettings.IsDelayScreenshot && taskSettings.CaptureSettings.DelayScreenshot > 0)
{
TaskEx.Run(() =>
{
int sleep = (int)(taskSettings.CaptureSettings.DelayScreenshot * 1000);
Thread.Sleep(sleep);
},
() =>
{
DoCaptureWork(capture, captureType, taskSettings, autoHideForm);
});
}
else
{
DoCaptureWork(capture, captureType, taskSettings, autoHideForm);
}
}
private void DoCaptureWork(ScreenCaptureDelegate capture, CaptureType captureType, TaskSettings taskSettings, bool autoHideForm = true)
{
if (autoHideForm)
{
Hide();
Thread.Sleep(250);
}
Image img = null;
try
{
img = capture();
}
catch (Exception ex)
{
DebugHelper.WriteException(ex);
}
finally
{
if (autoHideForm)
{
this.ForceActivate();
}
AfterCapture(img, captureType, taskSettings);
}
}
private void AfterCapture(Image img, CaptureType captureType, TaskSettings taskSettings)
{
if (img != null)
{
if (taskSettings.GeneralSettings.PlaySoundAfterCapture)
{
TaskHelpers.PlayCaptureSound(taskSettings);
}
if (taskSettings.ImageSettings.ImageEffectOnlyRegionCapture && !IsRegionCapture(captureType))
{
taskSettings.AfterCaptureJob = taskSettings.AfterCaptureJob.Remove(AfterCaptureTasks.AddImageEffects);
}
UploadManager.RunImageTask(img, taskSettings);
}
}
private bool IsRegionCapture(CaptureType captureType)
{
return captureType.HasFlagAny(CaptureType.Region, CaptureType.LastRegion);
}
private void CaptureActiveWindow(TaskSettings taskSettings, bool autoHideForm = true)
{
DoCapture(() =>
{
Image img;
string activeWindowTitle = NativeMethods.GetForegroundWindowText();
string activeProcessName = null;
using (Process process = NativeMethods.GetForegroundWindowProcess())
{
if (process != null)
{
activeProcessName = process.ProcessName;
}
}
if (taskSettings.CaptureSettings.CaptureTransparent && !taskSettings.CaptureSettings.CaptureClientArea)
{
img = TaskHelpers.GetScreenshot(taskSettings).CaptureActiveWindowTransparent();
}
else
{
img = TaskHelpers.GetScreenshot(taskSettings).CaptureActiveWindow();
}
img.Tag = new ImageTag
{
WindowTitle = activeWindowTitle,
ProcessName = activeProcessName
};
return img;
}, CaptureType.ActiveWindow, taskSettings, autoHideForm);
}
private void CaptureCustomRegion(TaskSettings taskSettings, bool autoHideForm)
{
DoCapture(() =>
{
Rectangle regionBounds = taskSettings.CaptureSettings.CaptureCustomRegion;
Image img = TaskHelpers.GetScreenshot(taskSettings).CaptureRectangle(regionBounds);
return img;
}, CaptureType.CustomRegion, taskSettings, autoHideForm);
}
private void CaptureWindow(IntPtr handle, TaskSettings taskSettings = null, bool autoHideForm = true)
{
if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings();
autoHideForm = autoHideForm && handle != Handle;
DoCapture(() =>
{
if (NativeMethods.IsIconic(handle))
{
NativeMethods.RestoreWindow(handle);
}
NativeMethods.SetForegroundWindow(handle);
Thread.Sleep(250);
if (taskSettings.CaptureSettings.CaptureTransparent && !taskSettings.CaptureSettings.CaptureClientArea)
{
return TaskHelpers.GetScreenshot(taskSettings).CaptureWindowTransparent(handle);
}
return TaskHelpers.GetScreenshot(taskSettings).CaptureWindow(handle);
}, CaptureType.Window, taskSettings, autoHideForm);
}
private void CaptureRegion(TaskSettings taskSettings, bool autoHideForm = true)
{
RegionCaptureForm form = new RegionCaptureForm(RegionCaptureMode.Annotation);
DoCapture(() =>
{
Image img = null;
try
{
form.Config = taskSettings.CaptureSettingsReference.SurfaceOptions;
form.Prepare(TaskHelpers.GetScreenshot(taskSettings).CaptureFullscreen());
form.ShowDialog();
img = form.GetResultImage();
if (img != null)
{
if (form.Result == RegionResult.Region && taskSettings.UploadSettings.RegionCaptureUseWindowPattern)
{
WindowInfo windowInfo = form.GetWindowInfo();
if (windowInfo != null)
{
img.Tag = new ImageTag
{
WindowTitle = windowInfo.Text,
ProcessName = windowInfo.ProcessName
};
}
}
lastRegionCaptureType = LastRegionCaptureType.Default;
}
}
finally
{
if (form != null)
{
form.Dispose();
}
}
return img;
}, CaptureType.Region, taskSettings, autoHideForm);
}
private void CaptureRectangleLight(TaskSettings taskSettings = null, bool autoHideForm = true)
{
if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings();
DoCapture(() =>
{
Image img = null;
using (RegionCaptureLightForm rectangleLight = new RegionCaptureLightForm(TaskHelpers.GetScreenshot(taskSettings)))
{
if (rectangleLight.ShowDialog() == DialogResult.OK)
{
img = rectangleLight.GetAreaImage();
if (img != null)
{
lastRegionCaptureType = LastRegionCaptureType.Light;
}
}
}
return img;
}, CaptureType.Region, taskSettings, autoHideForm);
}
private void CaptureRectangleTransparent(TaskSettings taskSettings = null, bool autoHideForm = true)
{
if (taskSettings == null) taskSettings = TaskSettings.GetDefaultTaskSettings();
DoCapture(() =>
{
Image img = null;
using (RegionCaptureTransparentForm rectangleTransparent = new RegionCaptureTransparentForm())
{
if (rectangleTransparent.ShowDialog() == DialogResult.OK)
{
img = rectangleTransparent.GetAreaImage(TaskHelpers.GetScreenshot(taskSettings));
if (img != null)
{
lastRegionCaptureType = LastRegionCaptureType.Transparent;
}
}
}
return img;
}, CaptureType.Region, taskSettings, autoHideForm);
}
private void CaptureLastRegion(TaskSettings taskSettings, bool autoHideForm = true)
{
switch (lastRegionCaptureType)
{
case LastRegionCaptureType.Default:
if (RegionCaptureForm.LastRegionFillPath != null)
{
DoCapture(() =>
{
using (Image screenshot = TaskHelpers.GetScreenshot(taskSettings).CaptureFullscreen())
{
return RegionCaptureTasks.ApplyRegionPathToImage(screenshot, RegionCaptureForm.LastRegionFillPath);
}
}, CaptureType.LastRegion, taskSettings, autoHideForm);
}
else
{
CaptureRegion(taskSettings, autoHideForm);
}
break;
case LastRegionCaptureType.Light:
if (!RegionCaptureLightForm.LastSelectionRectangle0Based.IsEmpty)
{
DoCapture(() =>
{
using (Image screenshot = TaskHelpers.GetScreenshot(taskSettings).CaptureFullscreen())
{
return ImageHelpers.CropImage(screenshot, RegionCaptureLightForm.LastSelectionRectangle0Based);
}
}, CaptureType.LastRegion, taskSettings, autoHideForm);
}
else
{
CaptureRectangleLight(taskSettings, autoHideForm);
}
break;
case LastRegionCaptureType.Transparent:
if (!RegionCaptureTransparentForm.LastSelectionRectangle0Based.IsEmpty)
{
DoCapture(() =>
{
using (Image screenshot = TaskHelpers.GetScreenshot(taskSettings).CaptureFullscreen())
{
return ImageHelpers.CropImage(screenshot, RegionCaptureTransparentForm.LastSelectionRectangle0Based);
}
}, CaptureType.LastRegion, taskSettings, autoHideForm);
}
else
{
CaptureRectangleTransparent(taskSettings, autoHideForm);
}
break;
}
TaskHelpers.ExecuteJob(hotkeySetting.TaskSettings);
}
private void PrepareCaptureMenuAsync(ToolStripMenuItem tsmiWindow, EventHandler handlerWindow, ToolStripMenuItem tsmiMonitor, EventHandler handlerMonitor)
@ -2309,7 +1796,7 @@ private void PrepareCaptureMenuAsync(ToolStripMenuItem tsmiWindow, EventHandler
private void tsmiFullscreen_Click(object sender, EventArgs e)
{
CaptureScreenshot(CaptureType.Fullscreen);
CaptureTaskHelpers.CaptureScreenshot(CaptureType.Fullscreen);
}
private void tsddbCapture_DropDownOpening(object sender, EventArgs e)
@ -2323,7 +1810,7 @@ private void tsmiWindowItems_Click(object sender, EventArgs e)
WindowInfo wi = tsi.Tag as WindowInfo;
if (wi != null)
{
CaptureWindow(wi.Handle);
CaptureTaskHelpers.CaptureWindow(wi.Handle);
}
}
@ -2333,28 +1820,28 @@ private void tsmiMonitorItems_Click(object sender, EventArgs e)
Rectangle rectangle = (Rectangle)tsi.Tag;
if (!rectangle.IsEmpty)
{
DoCapture(() => TaskHelpers.GetScreenshot().CaptureRectangle(rectangle), CaptureType.Monitor);
CaptureTaskHelpers.DoCapture(() => TaskHelpers.GetScreenshot().CaptureRectangle(rectangle), CaptureType.Monitor);
}
}
private void tsmiRectangle_Click(object sender, EventArgs e)
{
CaptureScreenshot(CaptureType.Region);
CaptureTaskHelpers.CaptureScreenshot(CaptureType.Region);
}
private void tsmiRectangleLight_Click(object sender, EventArgs e)
{
CaptureRectangleLight();
CaptureTaskHelpers.CaptureRectangleLight();
}
private void tsmiRectangleTransparent_Click(object sender, EventArgs e)
{
CaptureRectangleTransparent();
CaptureTaskHelpers.CaptureRectangleTransparent();
}
private void tsmiLastRegion_Click(object sender, EventArgs e)
{
CaptureScreenshot(CaptureType.LastRegion);
CaptureTaskHelpers.CaptureScreenshot(CaptureType.LastRegion);
}
#endregion Menu events
@ -2372,7 +1859,7 @@ private void cmsTray_Opened(object sender, EventArgs e)
private void tsmiTrayFullscreen_Click(object sender, EventArgs e)
{
CaptureScreenshot(CaptureType.Fullscreen, null, false);
CaptureTaskHelpers.CaptureScreenshot(CaptureType.Fullscreen, null, false);
}
private void tsmiCapture_DropDownOpening(object sender, EventArgs e)
@ -2386,7 +1873,7 @@ private void tsmiTrayWindowItems_Click(object sender, EventArgs e)
WindowInfo wi = tsi.Tag as WindowInfo;
if (wi != null)
{
CaptureWindow(wi.Handle, null, false);
CaptureTaskHelpers.CaptureWindow(wi.Handle, null, false);
}
}
@ -2396,18 +1883,18 @@ private void tsmiTrayMonitorItems_Click(object sender, EventArgs e)
Rectangle rectangle = (Rectangle)tsi.Tag;
if (!rectangle.IsEmpty)
{
DoCapture(() => TaskHelpers.GetScreenshot().CaptureRectangle(rectangle), CaptureType.Monitor, null, false);
CaptureTaskHelpers.DoCapture(() => TaskHelpers.GetScreenshot().CaptureRectangle(rectangle), CaptureType.Monitor, null, false);
}
}
private void tsmiTrayRectangle_Click(object sender, EventArgs e)
{
CaptureScreenshot(CaptureType.Region, null, false);
CaptureTaskHelpers.CaptureScreenshot(CaptureType.Region, null, false);
}
private void tsmiTrayRectangleLight_Click(object sender, EventArgs e)
{
CaptureRectangleLight(null, false);
CaptureTaskHelpers.CaptureRectangleLight(null, false);
}
private void lvUploads_ColumnWidthChanged(object sender, ColumnWidthChangedEventArgs e)
@ -2428,12 +1915,12 @@ private void pbPatreonHide_Click(object sender, EventArgs e)
private void tsmiTrayRectangleTransparent_Click(object sender, EventArgs e)
{
CaptureRectangleTransparent(null, false);
CaptureTaskHelpers.CaptureRectangleTransparent(null, false);
}
private void tsmiTrayLastRegion_Click(object sender, EventArgs e)
{
CaptureScreenshot(CaptureType.LastRegion, null, false);
CaptureTaskHelpers.CaptureScreenshot(CaptureType.LastRegion, null, false);
}
private void tsmiTrayTextCapture_Click(object sender, EventArgs e)

View file

@ -102,6 +102,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="CaptureTaskHelpers.cs" />
<Compile Include="Controls\BeforeUploadControl.cs">
<SubType>UserControl</SubType>
</Compile>

View file

@ -38,7 +38,6 @@ You should have received a copy of the GNU General Public License
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Speech.Synthesis;
using System.Windows.Forms;
@ -46,6 +45,188 @@ namespace ShareX
{
public static class TaskHelpers
{
public static void ExecuteJob(HotkeyType job, CLICommand command = null)
{
ExecuteJob(Program.DefaultTaskSettings, job, command);
}
public static void ExecuteJob(TaskSettings taskSettings)
{
ExecuteJob(taskSettings, taskSettings.Job);
}
public static void ExecuteJob(TaskSettings taskSettings, HotkeyType job, CLICommand command = null)
{
if (job == HotkeyType.None) return;
DebugHelper.WriteLine("Executing: " + job.GetLocalizedDescription());
TaskSettings safeTaskSettings = TaskSettings.GetSafeTaskSettings(taskSettings);
switch (job)
{
// Upload
case HotkeyType.FileUpload:
UploadManager.UploadFile(safeTaskSettings);
break;
case HotkeyType.FolderUpload:
UploadManager.UploadFolder(safeTaskSettings);
break;
case HotkeyType.ClipboardUpload:
UploadManager.ClipboardUpload(safeTaskSettings);
break;
case HotkeyType.ClipboardUploadWithContentViewer:
UploadManager.ClipboardUploadWithContentViewer(safeTaskSettings);
break;
case HotkeyType.UploadURL:
UploadManager.UploadURL(safeTaskSettings);
break;
case HotkeyType.DragDropUpload:
OpenDropWindow(safeTaskSettings);
break;
case HotkeyType.StopUploads:
TaskManager.StopAllTasks();
break;
// Screen capture
case HotkeyType.PrintScreen:
CaptureTaskHelpers.CaptureScreenshot(CaptureType.Fullscreen, safeTaskSettings, false);
break;
case HotkeyType.ActiveWindow:
CaptureTaskHelpers.CaptureScreenshot(CaptureType.ActiveWindow, safeTaskSettings, false);
break;
case HotkeyType.ActiveMonitor:
CaptureTaskHelpers.CaptureScreenshot(CaptureType.ActiveMonitor, safeTaskSettings, false);
break;
case HotkeyType.RectangleRegion:
CaptureTaskHelpers.CaptureScreenshot(CaptureType.Region, safeTaskSettings, false);
break;
case HotkeyType.RectangleLight:
CaptureTaskHelpers.CaptureRectangleLight(safeTaskSettings, false);
break;
case HotkeyType.RectangleTransparent:
CaptureTaskHelpers.CaptureRectangleTransparent(safeTaskSettings, false);
break;
case HotkeyType.CustomRegion:
CaptureTaskHelpers.CaptureScreenshot(CaptureType.CustomRegion, safeTaskSettings, false);
break;
case HotkeyType.LastRegion:
CaptureTaskHelpers.CaptureScreenshot(CaptureType.LastRegion, safeTaskSettings, false);
break;
case HotkeyType.ScrollingCapture:
OpenScrollingCapture(safeTaskSettings, true);
break;
case HotkeyType.CaptureWebpage:
OpenWebpageCapture(safeTaskSettings);
break;
case HotkeyType.TextCapture:
OpenOCR(safeTaskSettings);
break;
case HotkeyType.AutoCapture:
OpenAutoCapture();
break;
case HotkeyType.StartAutoCapture:
StartAutoCapture();
break;
// Screen record
case HotkeyType.ScreenRecorder:
StartScreenRecording(ScreenRecordOutput.FFmpeg, ScreenRecordStartMethod.Region, safeTaskSettings);
break;
case HotkeyType.ScreenRecorderActiveWindow:
StartScreenRecording(ScreenRecordOutput.FFmpeg, ScreenRecordStartMethod.ActiveWindow, safeTaskSettings);
break;
case HotkeyType.ScreenRecorderCustomRegion:
StartScreenRecording(ScreenRecordOutput.FFmpeg, ScreenRecordStartMethod.CustomRegion, safeTaskSettings);
break;
case HotkeyType.StartScreenRecorder:
StartScreenRecording(ScreenRecordOutput.FFmpeg, ScreenRecordStartMethod.LastRegion, safeTaskSettings);
break;
case HotkeyType.ScreenRecorderGIF:
StartScreenRecording(ScreenRecordOutput.GIF, ScreenRecordStartMethod.Region, safeTaskSettings);
break;
case HotkeyType.ScreenRecorderGIFActiveWindow:
StartScreenRecording(ScreenRecordOutput.GIF, ScreenRecordStartMethod.ActiveWindow, safeTaskSettings);
break;
case HotkeyType.ScreenRecorderGIFCustomRegion:
StartScreenRecording(ScreenRecordOutput.GIF, ScreenRecordStartMethod.CustomRegion, safeTaskSettings);
break;
case HotkeyType.StartScreenRecorderGIF:
StartScreenRecording(ScreenRecordOutput.GIF, ScreenRecordStartMethod.LastRegion, safeTaskSettings);
break;
case HotkeyType.AbortScreenRecording:
AbortScreenRecording();
break;
// Tools
case HotkeyType.ColorPicker:
OpenColorPicker();
break;
case HotkeyType.ScreenColorPicker:
OpenScreenColorPicker(safeTaskSettings);
break;
case HotkeyType.ImageEditor:
if (command != null && !string.IsNullOrEmpty(command.Parameter) && File.Exists(command.Parameter))
{
AnnotateImage(command.Parameter, safeTaskSettings);
}
else
{
AnnotateImage(safeTaskSettings);
}
break;
case HotkeyType.ImageEffects:
OpenImageEffects();
break;
case HotkeyType.HashCheck:
OpenHashCheck();
break;
case HotkeyType.DNSChanger:
OpenDNSChanger();
break;
case HotkeyType.QRCode:
OpenQRCode();
break;
case HotkeyType.Ruler:
OpenRuler(safeTaskSettings);
break;
case HotkeyType.Automate:
StartAutomate();
break;
case HotkeyType.IndexFolder:
UploadManager.IndexFolder();
break;
case HotkeyType.ImageCombiner:
OpenImageCombiner(safeTaskSettings);
break;
case HotkeyType.VideoThumbnailer:
OpenVideoThumbnailer(safeTaskSettings);
break;
case HotkeyType.FTPClient:
OpenFTPClient();
break;
case HotkeyType.TweetMessage:
TweetMessage();
break;
case HotkeyType.MonitorTest:
OpenMonitorTest();
break;
// Other
case HotkeyType.DisableHotkeys:
ToggleHotkeys();
break;
case HotkeyType.OpenMainWindow:
Program.MainForm.ForceActivate();
break;
case HotkeyType.OpenScreenshotsFolder:
OpenScreenshotsFolder();
break;
case HotkeyType.OpenHistory:
OpenHistory();
break;
case HotkeyType.OpenImageHistory:
OpenImageHistory();
break;
}
}
public static ImageData PrepareImage(Image img, TaskSettings taskSettings)
{
ImageData imageData = new ImageData();