diff --git a/.hgignore b/.hgignore
index e69de29..32783b8 100644
--- a/.hgignore
+++ b/.hgignore
@@ -0,0 +1,8 @@
+glob:OnTopReplica.suo
+glob:bin/*
+glob:obj/*
+glob:publish/*
+glob:*Thumbs.db
+glob:Installer/OnTopReplica-Setup.exe
+syntax: glob
+*.suo
diff --git a/Graphics/Raster/help.png b/Graphics/Raster/help.png
index e69de29..299ccbf 100644
Binary files a/Graphics/Raster/help.png and b/Graphics/Raster/help.png differ
diff --git a/Graphics/Raster/minimize.png b/Graphics/Raster/minimize.png
index e69de29..f6684e5 100644
Binary files a/Graphics/Raster/minimize.png and b/Graphics/Raster/minimize.png differ
diff --git a/Graphics/Vector/help.psd b/Graphics/Vector/help.psd
index e69de29..0d83dd5 100644
Binary files a/Graphics/Vector/help.psd and b/Graphics/Vector/help.psd differ
diff --git a/Graphics/Vector/minimize.psd b/Graphics/Vector/minimize.psd
index e69de29..89061b0 100644
Binary files a/Graphics/Vector/minimize.psd and b/Graphics/Vector/minimize.psd differ
diff --git a/OnTopReplica/FullscreenFormManager.cs b/OnTopReplica/FullscreenFormManager.cs
index e69de29..1263c3d 100644
--- a/OnTopReplica/FullscreenFormManager.cs
+++ b/OnTopReplica/FullscreenFormManager.cs
@@ -0,0 +1,117 @@
+using OnTopReplica.Properties;
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace OnTopReplica {
+ class FullscreenFormManager {
+
+ private readonly MainForm _mainForm;
+
+ public FullscreenFormManager(MainForm form) {
+ _mainForm = form;
+ IsFullscreen = false;
+ }
+
+ Point _preFullscreenLocation;
+ Size _preFullscreenSize;
+ FormBorderStyle _preFullscreenBorderStyle;
+
+ public bool IsFullscreen {
+ get;
+ private set;
+ }
+
+ public void SwitchFullscreen() {
+ SwitchFullscreen(Settings.Default.GetFullscreenMode());
+ }
+
+ public void SwitchFullscreen(FullscreenMode mode) {
+ if (IsFullscreen) {
+ MoveToFullscreenMode(mode);
+ return;
+ }
+
+ if (!_mainForm.ThumbnailPanel.IsShowingThumbnail)
+ return;
+
+ //On switch, always hide side panels
+ _mainForm.CloseSidePanel();
+
+ //Store state
+ _preFullscreenLocation = _mainForm.Location;
+ _preFullscreenSize = _mainForm.ClientSize;
+ _preFullscreenBorderStyle = _mainForm.FormBorderStyle;
+
+ //Change state to fullscreen
+ _mainForm.FormBorderStyle = FormBorderStyle.None;
+ MoveToFullscreenMode(mode);
+
+ CommonCompleteSwitch(true);
+ }
+
+ private void MoveToFullscreenMode(FullscreenMode mode) {
+ var screens = Screen.AllScreens;
+
+ var currentScreen = Screen.FromControl(_mainForm);
+ Size size = _mainForm.Size;
+ Point location = _mainForm.Location;
+
+ switch (mode) {
+ case FullscreenMode.Standard:
+ default:
+ size = currentScreen.WorkingArea.Size;
+ location = currentScreen.WorkingArea.Location;
+ break;
+
+ case FullscreenMode.Fullscreen:
+ size = currentScreen.Bounds.Size;
+ location = currentScreen.Bounds.Location;
+ break;
+
+ case FullscreenMode.AllScreens:
+ size = SystemInformation.VirtualScreen.Size;
+ location = SystemInformation.VirtualScreen.Location;
+ break;
+ }
+
+ _mainForm.Size = size;
+ _mainForm.Location = location;
+ }
+
+ public void SwitchBack() {
+ if (!IsFullscreen)
+ return;
+
+ //Restore state
+ _mainForm.FormBorderStyle = _preFullscreenBorderStyle;
+ _mainForm.Location = _preFullscreenLocation;
+ _mainForm.ClientSize = _preFullscreenSize;
+ _mainForm.RefreshAspectRatio();
+
+ CommonCompleteSwitch(false);
+ }
+
+ private void CommonCompleteSwitch(bool enabled) {
+ //UI stuff switching
+ _mainForm.GlassEnabled = !enabled;
+ _mainForm.TopMost = !enabled;
+ _mainForm.HandleMouseMove = !enabled;
+
+ IsFullscreen = enabled;
+
+ Program.Platform.OnFormStateChange(_mainForm);
+ }
+
+ public void Toggle() {
+ if (IsFullscreen)
+ SwitchBack();
+ else
+ SwitchFullscreen(Settings.Default.GetFullscreenMode());
+ }
+
+ }
+}
diff --git a/OnTopReplica/FullscreenMode.cs b/OnTopReplica/FullscreenMode.cs
index e69de29..83f4700 100644
--- a/OnTopReplica/FullscreenMode.cs
+++ b/OnTopReplica/FullscreenMode.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Xml.Serialization;
+using OnTopReplica.Properties;
+
+namespace OnTopReplica {
+ ///
+ /// Describes a fullscreen mode.
+ ///
+ enum FullscreenMode {
+ Standard,
+ Fullscreen,
+ AllScreens
+ }
+
+ static class FullscreenModeExtensions {
+
+ ///
+ /// Gets the fullscreen mode as an enumeration value.
+ ///
+ public static FullscreenMode GetFullscreenMode(this Settings settings) {
+ FullscreenMode retMode = FullscreenMode.Standard;
+
+ Enum.TryParse(settings.FullscreenMode, out retMode);
+
+ return retMode;
+ }
+
+ ///
+ /// Sets the fullscreen mode.
+ ///
+ public static void SetFullscreenMode(this Settings settings, FullscreenMode mode) {
+ settings.FullscreenMode = mode.ToString();
+ }
+
+ }
+}
diff --git a/OnTopReplica/MainForm.Designer.cs b/OnTopReplica/MainForm.Designer.cs
index e69de29..356788c 100644
--- a/OnTopReplica/MainForm.Designer.cs
+++ b/OnTopReplica/MainForm.Designer.cs
@@ -0,0 +1,600 @@
+namespace OnTopReplica
+{
+ partial class MainForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent() {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+ this.menuContext = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.menuContextWindows = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuWindows = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.noneToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.switchToWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.selectRegionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.advancedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.clickForwardingToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.clickThroughToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.groupSwitchModeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.restoreLastClonedWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuContextOpacity = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuOpacity = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripMenuItem();
+ this.fullOpacityToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.resizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuResize = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.doubleToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.fitToWindowToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.halfToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.quarterToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
+ this.fullscreenToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.restorePositionAndSizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.dockToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.disabledToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.topLeftToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.topRightToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.centerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.bottomLeftToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.bottomRightToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.chromeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.reduceToIconToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+ this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuContextClose = new System.Windows.Forms.ToolStripMenuItem();
+ this.fullSelectWindowToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuFullscreenContext = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.modeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuModeStandardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuModeFullscreenToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuModeAllScreensToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.enableClickthroughToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.fullExitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuContext.SuspendLayout();
+ this.menuWindows.SuspendLayout();
+ this.menuOpacity.SuspendLayout();
+ this.menuResize.SuspendLayout();
+ this.menuFullscreenContext.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // menuContext
+ //
+ this.menuContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.menuContextWindows,
+ this.switchToWindowToolStripMenuItem,
+ this.selectRegionToolStripMenuItem,
+ this.advancedToolStripMenuItem,
+ this.menuContextOpacity,
+ this.resizeToolStripMenuItem,
+ this.dockToolStripMenuItem,
+ this.chromeToolStripMenuItem,
+ this.reduceToIconToolStripMenuItem,
+ this.toolStripSeparator1,
+ this.settingsToolStripMenuItem,
+ this.aboutToolStripMenuItem,
+ this.menuContextClose});
+ this.menuContext.Name = "menuContext";
+ this.menuContext.Size = new System.Drawing.Size(187, 274);
+ this.menuContext.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_opening);
+ //
+ // menuContextWindows
+ //
+ this.menuContextWindows.DropDown = this.menuWindows;
+ this.menuContextWindows.Image = global::OnTopReplica.Properties.Resources.list;
+ this.menuContextWindows.Name = "menuContextWindows";
+ this.menuContextWindows.Size = new System.Drawing.Size(186, 22);
+ this.menuContextWindows.Text = global::OnTopReplica.Strings.MenuWindows;
+ this.menuContextWindows.ToolTipText = global::OnTopReplica.Strings.MenuWindowsTT;
+ //
+ // menuWindows
+ //
+ this.menuWindows.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.noneToolStripMenuItem});
+ this.menuWindows.Name = "menuWindows";
+ this.menuWindows.Size = new System.Drawing.Size(118, 26);
+ //
+ // noneToolStripMenuItem
+ //
+ this.noneToolStripMenuItem.Name = "noneToolStripMenuItem";
+ this.noneToolStripMenuItem.Size = new System.Drawing.Size(117, 22);
+ this.noneToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuWindowsNone;
+ //
+ // switchToWindowToolStripMenuItem
+ //
+ this.switchToWindowToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.xiao_arrow;
+ this.switchToWindowToolStripMenuItem.Name = "switchToWindowToolStripMenuItem";
+ this.switchToWindowToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.switchToWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuSwitch;
+ this.switchToWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuSwitchTT;
+ this.switchToWindowToolStripMenuItem.Click += new System.EventHandler(this.Menu_Switch_click);
+ //
+ // selectRegionToolStripMenuItem
+ //
+ this.selectRegionToolStripMenuItem.Enabled = false;
+ this.selectRegionToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.regions;
+ this.selectRegionToolStripMenuItem.Name = "selectRegionToolStripMenuItem";
+ this.selectRegionToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.selectRegionToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRegion;
+ this.selectRegionToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRegionTT;
+ this.selectRegionToolStripMenuItem.Click += new System.EventHandler(this.Menu_Region_click);
+ //
+ // advancedToolStripMenuItem
+ //
+ this.advancedToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.clickForwardingToolStripMenuItem,
+ this.clickThroughToolStripMenuItem,
+ this.groupSwitchModeToolStripMenuItem,
+ this.restoreLastClonedWindowToolStripMenuItem});
+ this.advancedToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.xiao_wrench;
+ this.advancedToolStripMenuItem.Name = "advancedToolStripMenuItem";
+ this.advancedToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.advancedToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuAdvanced;
+ this.advancedToolStripMenuItem.DropDownOpening += new System.EventHandler(this.Menu_Advanced_opening);
+ //
+ // clickForwardingToolStripMenuItem
+ //
+ this.clickForwardingToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.clickforwarding;
+ this.clickForwardingToolStripMenuItem.Name = "clickForwardingToolStripMenuItem";
+ this.clickForwardingToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
+ this.clickForwardingToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuClickForwarding;
+ this.clickForwardingToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuClickForwardingTT;
+ this.clickForwardingToolStripMenuItem.Click += new System.EventHandler(this.Menu_ClickForwarding_click);
+ //
+ // clickThroughToolStripMenuItem
+ //
+ this.clickThroughToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.window_opacity;
+ this.clickThroughToolStripMenuItem.Name = "clickThroughToolStripMenuItem";
+ this.clickThroughToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
+ this.clickThroughToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuClickThrough;
+ this.clickThroughToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuClickThroughTT;
+ this.clickThroughToolStripMenuItem.Click += new System.EventHandler(this.Menu_ClickThrough_click);
+ //
+ // groupSwitchModeToolStripMenuItem
+ //
+ this.groupSwitchModeToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.groupmode;
+ this.groupSwitchModeToolStripMenuItem.Name = "groupSwitchModeToolStripMenuItem";
+ this.groupSwitchModeToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
+ this.groupSwitchModeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuGroupSwitch;
+ this.groupSwitchModeToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuGroupSwitchTT;
+ this.groupSwitchModeToolStripMenuItem.Click += new System.EventHandler(this.Menu_GroupSwitchMode_click);
+ //
+ // restoreLastClonedWindowToolStripMenuItem
+ //
+ this.restoreLastClonedWindowToolStripMenuItem.Name = "restoreLastClonedWindowToolStripMenuItem";
+ this.restoreLastClonedWindowToolStripMenuItem.Size = new System.Drawing.Size(218, 22);
+ this.restoreLastClonedWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRestoreLast;
+ this.restoreLastClonedWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRestoreLastTT;
+ this.restoreLastClonedWindowToolStripMenuItem.Click += new System.EventHandler(this.Menu_RestoreLastWindow_click);
+ //
+ // menuContextOpacity
+ //
+ this.menuContextOpacity.DropDown = this.menuOpacity;
+ this.menuContextOpacity.Image = global::OnTopReplica.Properties.Resources.window_opacity;
+ this.menuContextOpacity.Name = "menuContextOpacity";
+ this.menuContextOpacity.Size = new System.Drawing.Size(186, 22);
+ this.menuContextOpacity.Text = global::OnTopReplica.Strings.MenuOpacity;
+ //
+ // menuOpacity
+ //
+ this.menuOpacity.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.toolStripMenuItem1,
+ this.toolStripMenuItem2,
+ this.toolStripMenuItem3,
+ this.toolStripMenuItem4});
+ this.menuOpacity.Name = "menuOpacity";
+ this.menuOpacity.OwnerItem = this.menuContextOpacity;
+ this.menuOpacity.ShowCheckMargin = true;
+ this.menuOpacity.ShowImageMargin = false;
+ this.menuOpacity.Size = new System.Drawing.Size(154, 92);
+ this.menuOpacity.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_Opacity_opening);
+ //
+ // toolStripMenuItem1
+ //
+ this.toolStripMenuItem1.Checked = true;
+ this.toolStripMenuItem1.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+ this.toolStripMenuItem1.Size = new System.Drawing.Size(153, 22);
+ this.toolStripMenuItem1.Tag = 1D;
+ this.toolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuOp100;
+ this.toolStripMenuItem1.ToolTipText = global::OnTopReplica.Strings.MenuOp100TT;
+ this.toolStripMenuItem1.Click += new System.EventHandler(this.Menu_Opacity_click);
+ //
+ // toolStripMenuItem2
+ //
+ this.toolStripMenuItem2.Name = "toolStripMenuItem2";
+ this.toolStripMenuItem2.Size = new System.Drawing.Size(153, 22);
+ this.toolStripMenuItem2.Tag = 0.75D;
+ this.toolStripMenuItem2.Text = global::OnTopReplica.Strings.MenuOp75;
+ this.toolStripMenuItem2.ToolTipText = global::OnTopReplica.Strings.MenuOp75TT;
+ this.toolStripMenuItem2.Click += new System.EventHandler(this.Menu_Opacity_click);
+ //
+ // toolStripMenuItem3
+ //
+ this.toolStripMenuItem3.Name = "toolStripMenuItem3";
+ this.toolStripMenuItem3.Size = new System.Drawing.Size(153, 22);
+ this.toolStripMenuItem3.Tag = 0.5D;
+ this.toolStripMenuItem3.Text = global::OnTopReplica.Strings.MenuOp50;
+ this.toolStripMenuItem3.ToolTipText = global::OnTopReplica.Strings.MenuOp50TT;
+ this.toolStripMenuItem3.Click += new System.EventHandler(this.Menu_Opacity_click);
+ //
+ // toolStripMenuItem4
+ //
+ this.toolStripMenuItem4.Name = "toolStripMenuItem4";
+ this.toolStripMenuItem4.Size = new System.Drawing.Size(153, 22);
+ this.toolStripMenuItem4.Tag = 0.25D;
+ this.toolStripMenuItem4.Text = global::OnTopReplica.Strings.MenuOp25;
+ this.toolStripMenuItem4.ToolTipText = global::OnTopReplica.Strings.MenuOp25TT;
+ this.toolStripMenuItem4.Click += new System.EventHandler(this.Menu_Opacity_click);
+ //
+ // fullOpacityToolStripMenuItem
+ //
+ this.fullOpacityToolStripMenuItem.DropDown = this.menuOpacity;
+ this.fullOpacityToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.window_opacity;
+ this.fullOpacityToolStripMenuItem.Name = "fullOpacityToolStripMenuItem";
+ this.fullOpacityToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
+ this.fullOpacityToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuOpacity;
+ //
+ // resizeToolStripMenuItem
+ //
+ this.resizeToolStripMenuItem.DropDown = this.menuResize;
+ this.resizeToolStripMenuItem.Enabled = false;
+ this.resizeToolStripMenuItem.Name = "resizeToolStripMenuItem";
+ this.resizeToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.resizeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuResize;
+ //
+ // menuResize
+ //
+ this.menuResize.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.doubleToolStripMenuItem1,
+ this.fitToWindowToolStripMenuItem1,
+ this.halfToolStripMenuItem1,
+ this.quarterToolStripMenuItem1,
+ this.toolStripSeparator3,
+ this.fullscreenToolStripMenuItem1,
+ this.toolStripSeparator2,
+ this.restorePositionAndSizeToolStripMenuItem});
+ this.menuResize.Name = "menuResize";
+ this.menuResize.OwnerItem = this.resizeToolStripMenuItem;
+ this.menuResize.Size = new System.Drawing.Size(218, 148);
+ this.menuResize.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_Resize_opening);
+ //
+ // doubleToolStripMenuItem1
+ //
+ this.doubleToolStripMenuItem1.Name = "doubleToolStripMenuItem1";
+ this.doubleToolStripMenuItem1.Size = new System.Drawing.Size(217, 22);
+ this.doubleToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitDouble;
+ this.doubleToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_Double);
+ //
+ // fitToWindowToolStripMenuItem1
+ //
+ this.fitToWindowToolStripMenuItem1.Name = "fitToWindowToolStripMenuItem1";
+ this.fitToWindowToolStripMenuItem1.Size = new System.Drawing.Size(217, 22);
+ this.fitToWindowToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitOriginal;
+ this.fitToWindowToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_FitToWindow);
+ //
+ // halfToolStripMenuItem1
+ //
+ this.halfToolStripMenuItem1.Name = "halfToolStripMenuItem1";
+ this.halfToolStripMenuItem1.Size = new System.Drawing.Size(217, 22);
+ this.halfToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitHalf;
+ this.halfToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_Half);
+ //
+ // quarterToolStripMenuItem1
+ //
+ this.quarterToolStripMenuItem1.Name = "quarterToolStripMenuItem1";
+ this.quarterToolStripMenuItem1.Size = new System.Drawing.Size(217, 22);
+ this.quarterToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitQuarter;
+ this.quarterToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_Quarter);
+ //
+ // toolStripSeparator3
+ //
+ this.toolStripSeparator3.Name = "toolStripSeparator3";
+ this.toolStripSeparator3.Size = new System.Drawing.Size(214, 6);
+ //
+ // fullscreenToolStripMenuItem1
+ //
+ this.fullscreenToolStripMenuItem1.Image = global::OnTopReplica.Properties.Resources.fullscreen;
+ this.fullscreenToolStripMenuItem1.Name = "fullscreenToolStripMenuItem1";
+ this.fullscreenToolStripMenuItem1.Size = new System.Drawing.Size(217, 22);
+ this.fullscreenToolStripMenuItem1.Text = global::OnTopReplica.Strings.MenuFitFullscreen;
+ this.fullscreenToolStripMenuItem1.Click += new System.EventHandler(this.Menu_Resize_Fullscreen);
+ //
+ // toolStripSeparator2
+ //
+ this.toolStripSeparator2.Name = "toolStripSeparator2";
+ this.toolStripSeparator2.Size = new System.Drawing.Size(214, 6);
+ //
+ // restorePositionAndSizeToolStripMenuItem
+ //
+ this.restorePositionAndSizeToolStripMenuItem.Name = "restorePositionAndSizeToolStripMenuItem";
+ this.restorePositionAndSizeToolStripMenuItem.Size = new System.Drawing.Size(217, 22);
+ this.restorePositionAndSizeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuRecall;
+ this.restorePositionAndSizeToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuRecallTT;
+ this.restorePositionAndSizeToolStripMenuItem.Click += new System.EventHandler(this.Menu_Resize_RecallPosition_click);
+ //
+ // dockToolStripMenuItem
+ //
+ this.dockToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.disabledToolStripMenuItem,
+ this.topLeftToolStripMenuItem,
+ this.topRightToolStripMenuItem,
+ this.centerToolStripMenuItem,
+ this.bottomLeftToolStripMenuItem,
+ this.bottomRightToolStripMenuItem});
+ this.dockToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_null;
+ this.dockToolStripMenuItem.Name = "dockToolStripMenuItem";
+ this.dockToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.dockToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosition;
+ this.dockToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuPositionTT;
+ this.dockToolStripMenuItem.DropDownOpening += new System.EventHandler(this.Menu_Position_Opening);
+ //
+ // disabledToolStripMenuItem
+ //
+ this.disabledToolStripMenuItem.Checked = true;
+ this.disabledToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.disabledToolStripMenuItem.Name = "disabledToolStripMenuItem";
+ this.disabledToolStripMenuItem.Size = new System.Drawing.Size(145, 22);
+ this.disabledToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosDisabled;
+ this.disabledToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_Disable);
+ //
+ // topLeftToolStripMenuItem
+ //
+ this.topLeftToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_topleft;
+ this.topLeftToolStripMenuItem.Name = "topLeftToolStripMenuItem";
+ this.topLeftToolStripMenuItem.Size = new System.Drawing.Size(145, 22);
+ this.topLeftToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosTopLeft;
+ this.topLeftToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_TopLeft);
+ //
+ // topRightToolStripMenuItem
+ //
+ this.topRightToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_topright;
+ this.topRightToolStripMenuItem.Name = "topRightToolStripMenuItem";
+ this.topRightToolStripMenuItem.Size = new System.Drawing.Size(145, 22);
+ this.topRightToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosTopRight;
+ this.topRightToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_TopRight);
+ //
+ // centerToolStripMenuItem
+ //
+ this.centerToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_center;
+ this.centerToolStripMenuItem.Name = "centerToolStripMenuItem";
+ this.centerToolStripMenuItem.Size = new System.Drawing.Size(145, 22);
+ this.centerToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosCenter;
+ this.centerToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_Center);
+ //
+ // bottomLeftToolStripMenuItem
+ //
+ this.bottomLeftToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_bottomleft;
+ this.bottomLeftToolStripMenuItem.Name = "bottomLeftToolStripMenuItem";
+ this.bottomLeftToolStripMenuItem.Size = new System.Drawing.Size(145, 22);
+ this.bottomLeftToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosBottomLeft;
+ this.bottomLeftToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_BottomLeft);
+ //
+ // bottomRightToolStripMenuItem
+ //
+ this.bottomRightToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_bottomright;
+ this.bottomRightToolStripMenuItem.Name = "bottomRightToolStripMenuItem";
+ this.bottomRightToolStripMenuItem.Size = new System.Drawing.Size(145, 22);
+ this.bottomRightToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuPosBottomRight;
+ this.bottomRightToolStripMenuItem.Click += new System.EventHandler(this.Menu_Position_BottomRight);
+ //
+ // chromeToolStripMenuItem
+ //
+ this.chromeToolStripMenuItem.Name = "chromeToolStripMenuItem";
+ this.chromeToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.chromeToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuChrome;
+ this.chromeToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuChromeTT;
+ this.chromeToolStripMenuItem.Click += new System.EventHandler(this.Menu_Chrome_click);
+ //
+ // reduceToIconToolStripMenuItem
+ //
+ this.reduceToIconToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.minimize;
+ this.reduceToIconToolStripMenuItem.Name = "reduceToIconToolStripMenuItem";
+ this.reduceToIconToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.reduceToIconToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuReduce;
+ this.reduceToIconToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuReduceTT;
+ this.reduceToIconToolStripMenuItem.Click += new System.EventHandler(this.Menu_Reduce_click);
+ //
+ // toolStripSeparator1
+ //
+ this.toolStripSeparator1.Name = "toolStripSeparator1";
+ this.toolStripSeparator1.Size = new System.Drawing.Size(183, 6);
+ //
+ // settingsToolStripMenuItem
+ //
+ this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem";
+ this.settingsToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.settingsToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuSettings;
+ this.settingsToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuSettingsTT;
+ this.settingsToolStripMenuItem.Click += new System.EventHandler(this.Menu_Settings_click);
+ //
+ // aboutToolStripMenuItem
+ //
+ this.aboutToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.help;
+ this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
+ this.aboutToolStripMenuItem.Size = new System.Drawing.Size(186, 22);
+ this.aboutToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuAbout;
+ this.aboutToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuAboutTT;
+ this.aboutToolStripMenuItem.Click += new System.EventHandler(this.Menu_About_click);
+ //
+ // menuContextClose
+ //
+ this.menuContextClose.Image = global::OnTopReplica.Properties.Resources.close_new;
+ this.menuContextClose.Name = "menuContextClose";
+ this.menuContextClose.Size = new System.Drawing.Size(186, 22);
+ this.menuContextClose.Text = global::OnTopReplica.Strings.MenuClose;
+ this.menuContextClose.Click += new System.EventHandler(this.Menu_Close_click);
+ //
+ // fullSelectWindowToolStripMenuItem
+ //
+ this.fullSelectWindowToolStripMenuItem.DropDown = this.menuWindows;
+ this.fullSelectWindowToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.list;
+ this.fullSelectWindowToolStripMenuItem.Name = "fullSelectWindowToolStripMenuItem";
+ this.fullSelectWindowToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
+ this.fullSelectWindowToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuWindows;
+ this.fullSelectWindowToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuWindowsTT;
+ //
+ // menuFullscreenContext
+ //
+ this.menuFullscreenContext.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.fullSelectWindowToolStripMenuItem,
+ this.modeToolStripMenuItem,
+ this.fullOpacityToolStripMenuItem,
+ this.enableClickthroughToolStripMenuItem,
+ this.fullExitToolStripMenuItem});
+ this.menuFullscreenContext.Name = "menuFullscreenContext";
+ this.menuFullscreenContext.Size = new System.Drawing.Size(190, 136);
+ //
+ // modeToolStripMenuItem
+ //
+ this.modeToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.menuModeStandardToolStripMenuItem,
+ this.menuModeFullscreenToolStripMenuItem,
+ this.menuModeAllScreensToolStripMenuItem});
+ this.modeToolStripMenuItem.Name = "modeToolStripMenuItem";
+ this.modeToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
+ this.modeToolStripMenuItem.Text = "Mode";
+ this.modeToolStripMenuItem.DropDownOpening += new System.EventHandler(this.Menu_Fullscreen_Mode_opening);
+ //
+ // menuModeStandardToolStripMenuItem
+ //
+ this.menuModeStandardToolStripMenuItem.Name = "menuModeStandardToolStripMenuItem";
+ this.menuModeStandardToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.menuModeStandardToolStripMenuItem.Text = "Standard";
+ this.menuModeStandardToolStripMenuItem.Click += new System.EventHandler(this.Menu_Fullscreen_Mode_Standard_click);
+ //
+ // menuModeFullscreenToolStripMenuItem
+ //
+ this.menuModeFullscreenToolStripMenuItem.Name = "menuModeFullscreenToolStripMenuItem";
+ this.menuModeFullscreenToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.menuModeFullscreenToolStripMenuItem.Text = "Fullscreen";
+ this.menuModeFullscreenToolStripMenuItem.Click += new System.EventHandler(this.Menu_Fullscreen_Mode_Fullscreen_click);
+ //
+ // menuModeAllScreensToolStripMenuItem
+ //
+ this.menuModeAllScreensToolStripMenuItem.Name = "menuModeAllScreensToolStripMenuItem";
+ this.menuModeAllScreensToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
+ this.menuModeAllScreensToolStripMenuItem.Text = "All screens";
+ this.menuModeAllScreensToolStripMenuItem.Click += new System.EventHandler(this.Menu_Fullscreen_Mode_AllScreens_click);
+ //
+ // enableClickthroughToolStripMenuItem
+ //
+ this.enableClickthroughToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.clickforwarding;
+ this.enableClickthroughToolStripMenuItem.Name = "enableClickthroughToolStripMenuItem";
+ this.enableClickthroughToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
+ this.enableClickthroughToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuClickThrough;
+ this.enableClickthroughToolStripMenuItem.ToolTipText = global::OnTopReplica.Strings.MenuClickThroughTT;
+ this.enableClickthroughToolStripMenuItem.Click += new System.EventHandler(this.Menu_ClickThrough_click);
+ //
+ // fullExitToolStripMenuItem
+ //
+ this.fullExitToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.close_new;
+ this.fullExitToolStripMenuItem.Name = "fullExitToolStripMenuItem";
+ this.fullExitToolStripMenuItem.Size = new System.Drawing.Size(189, 22);
+ this.fullExitToolStripMenuItem.Text = global::OnTopReplica.Strings.MenuQuitFullscreen;
+ this.fullExitToolStripMenuItem.Click += new System.EventHandler(this.Menu_Fullscreen_ExitFullscreen_click);
+ //
+ // MainForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.BackColor = System.Drawing.SystemColors.Control;
+ this.ClientSize = new System.Drawing.Size(324, 232);
+ this.ControlBox = false;
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
+ this.HideCaption = true;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.MinimumSize = new System.Drawing.Size(44, 44);
+ this.Name = "MainForm";
+ this.Text = "OnTopReplica";
+ this.TopMost = true;
+ this.menuContext.ResumeLayout(false);
+ this.menuWindows.ResumeLayout(false);
+ this.menuOpacity.ResumeLayout(false);
+ this.menuResize.ResumeLayout(false);
+ this.menuFullscreenContext.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.ContextMenuStrip menuContext;
+ private System.Windows.Forms.ToolStripMenuItem menuContextWindows;
+ private System.Windows.Forms.ToolStripMenuItem menuContextClose;
+ private System.Windows.Forms.ContextMenuStrip menuWindows;
+ private System.Windows.Forms.ToolStripMenuItem menuContextOpacity;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
+ private System.Windows.Forms.ContextMenuStrip menuOpacity;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem2;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem3;
+ private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem4;
+ private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem reduceToIconToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem selectRegionToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem resizeToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem noneToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem switchToWindowToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem dockToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem topLeftToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem topRightToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem bottomLeftToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem bottomRightToolStripMenuItem;
+ private System.Windows.Forms.ContextMenuStrip menuResize;
+ private System.Windows.Forms.ToolStripMenuItem doubleToolStripMenuItem1;
+ private System.Windows.Forms.ToolStripMenuItem fitToWindowToolStripMenuItem1;
+ private System.Windows.Forms.ToolStripMenuItem halfToolStripMenuItem1;
+ private System.Windows.Forms.ToolStripMenuItem quarterToolStripMenuItem1;
+ private System.Windows.Forms.ToolStripMenuItem fullscreenToolStripMenuItem1;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
+ private System.Windows.Forms.ToolStripMenuItem chromeToolStripMenuItem;
+ private System.Windows.Forms.ContextMenuStrip menuFullscreenContext;
+ private System.Windows.Forms.ToolStripMenuItem fullSelectWindowToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem fullOpacityToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem fullExitToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem advancedToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem clickForwardingToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem clickThroughToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem groupSwitchModeToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem enableClickthroughToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem centerToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem disabledToolStripMenuItem;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
+ private System.Windows.Forms.ToolStripMenuItem restorePositionAndSizeToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem restoreLastClonedWindowToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem settingsToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem modeToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem menuModeStandardToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem menuModeFullscreenToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem menuModeAllScreensToolStripMenuItem;
+ }
+}
+
diff --git a/OnTopReplica/MainForm.cs b/OnTopReplica/MainForm.cs
index e69de29..9450846 100644
--- a/OnTopReplica/MainForm.cs
+++ b/OnTopReplica/MainForm.cs
@@ -0,0 +1,422 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using OnTopReplica.Native;
+using OnTopReplica.Properties;
+using OnTopReplica.StartupOptions;
+using OnTopReplica.Update;
+using OnTopReplica.WindowSeekers;
+using WindowsFormsAero.Dwm;
+using WindowsFormsAero.TaskDialog;
+
+namespace OnTopReplica {
+
+ partial class MainForm : AspectRatioForm {
+
+ //GUI elements
+ ThumbnailPanel _thumbnailPanel;
+
+ //Managers
+ readonly MessagePumpManager _msgPumpManager = new MessagePumpManager();
+ WindowListMenuManager _windowListManager;
+ public FullscreenFormManager FullscreenManager { get; private set; }
+
+ Options _startupOptions;
+
+ public MainForm(Options startupOptions) {
+ _startupOptions = startupOptions;
+
+ FullscreenManager = new FullscreenFormManager(this);
+
+ //WinForms init pass
+ InitializeComponent();
+
+ //Store default values
+ DefaultNonClickTransparencyKey = this.TransparencyKey;
+ DefaultBorderStyle = this.FormBorderStyle;
+
+ //Thumbnail panel
+ _thumbnailPanel = new ThumbnailPanel {
+ Location = Point.Empty,
+ Dock = DockStyle.Fill
+ };
+ _thumbnailPanel.CloneClick += new EventHandler(Thumbnail_CloneClick);
+ Controls.Add(_thumbnailPanel);
+
+ //Set native renderer on context menus
+ Asztal.Szótár.NativeToolStripRenderer.SetToolStripRenderer(
+ menuContext, menuWindows, menuOpacity, menuResize, menuFullscreenContext
+ );
+
+ //Set to Key event preview
+ this.KeyPreview = true;
+ }
+
+ #region Event override
+
+ protected override void OnHandleCreated(EventArgs e){
+ base.OnHandleCreated(e);
+
+ //Window init
+ KeepAspectRatio = false;
+ GlassEnabled = true;
+ GlassMargins = new Margins(-1);
+
+ //Managers
+ _msgPumpManager.Initialize(this);
+ _windowListManager = new WindowListMenuManager(this, menuWindows);
+ _windowListManager.ParentMenus = new System.Windows.Forms.ContextMenuStrip[] {
+ menuContext, menuFullscreenContext
+ };
+
+ //Platform specific form initialization
+ Program.Platform.PostHandleFormInit(this);
+ }
+
+ protected override void OnShown(EventArgs e) {
+ base.OnShown(e);
+
+ //Apply startup options
+ _startupOptions.Apply(this);
+ }
+
+ protected override void OnClosing(CancelEventArgs e) {
+ //Store last thumbnail, if any
+ if (_thumbnailPanel.IsShowingThumbnail && CurrentThumbnailWindowHandle != null) {
+ Settings.Default.RestoreLastWindowTitle = CurrentThumbnailWindowHandle.Title;
+ Settings.Default.RestoreLastWindowHwnd = CurrentThumbnailWindowHandle.Handle.ToInt64();
+ Settings.Default.RestoreLastWindowClass = CurrentThumbnailWindowHandle.Class;
+ }
+
+ _msgPumpManager.Dispose();
+ Program.Platform.CloseForm(this);
+
+ base.OnClosing(e);
+ }
+
+ protected override void OnMove(EventArgs e) {
+ base.OnMove(e);
+
+ AdjustSidePanelLocation();
+ }
+
+ protected override void OnResizeEnd(EventArgs e) {
+ base.OnResizeEnd(e);
+
+ RefreshScreenLock();
+ }
+
+ protected override void OnActivated(EventArgs e) {
+ base.OnActivated(e);
+
+ //Deactivate click-through if form is reactivated
+ if (ClickThroughEnabled) {
+ ClickThroughEnabled = false;
+ }
+
+ Program.Platform.RestoreForm(this);
+ }
+
+ protected override void OnDeactivate(EventArgs e) {
+ base.OnDeactivate(e);
+
+ //HACK: sometimes, even if TopMost is true, the window loses its "always on top" status.
+ // This is a fix attempt that probably won't work...
+ if (!FullscreenManager.IsFullscreen) { //fullscreen mode doesn't use TopMost
+ TopMost = false;
+ TopMost = true;
+ }
+ }
+
+ protected override void OnMouseWheel(MouseEventArgs e) {
+ base.OnMouseWheel(e);
+
+ if (!FullscreenManager.IsFullscreen) {
+ int change = (int)(e.Delta / 6.0); //assumes a mouse wheel "tick" is in the 80-120 range
+ AdjustSize(change);
+ RefreshScreenLock();
+ }
+ }
+
+ protected override void OnMouseDoubleClick(MouseEventArgs e) {
+ base.OnMouseDoubleClick(e);
+
+ //This is handled by the WM_NCLBUTTONDBLCLK msg handler usually (because the GlassForm translates
+ //clicks on client to clicks on caption). But if fullscreen mode disables GlassForm dragging, we need
+ //this auxiliary handler to switch mode.
+ FullscreenManager.Toggle();
+ }
+
+ protected override void OnMouseClick(MouseEventArgs e) {
+ base.OnMouseClick(e);
+
+ //Same story as above (OnMouseDoubleClick)
+ if (e.Button == System.Windows.Forms.MouseButtons.Right) {
+ OpenContextMenu(null);
+ }
+ }
+
+ protected override void WndProc(ref Message m) {
+ if (_msgPumpManager != null) {
+ if (_msgPumpManager.PumpMessage(ref m)) {
+ return;
+ }
+ }
+
+ switch (m.Msg) {
+ case WM.NCRBUTTONUP:
+ //Open context menu if right button clicked on caption (i.e. all of the window area because of glass)
+ if (m.WParam.ToInt32() == HT.CAPTION) {
+ OpenContextMenu(null);
+
+ m.Result = IntPtr.Zero;
+ return;
+ }
+ break;
+
+ case WM.NCLBUTTONDBLCLK:
+ //Toggle fullscreen mode if double click on caption (whole glass area)
+ if (m.WParam.ToInt32() == HT.CAPTION) {
+ FullscreenManager.Toggle();
+
+ m.Result = IntPtr.Zero;
+ return;
+ }
+ break;
+
+ case WM.NCHITTEST:
+ //Make transparent to hit-testing if in click through mode
+ if (ClickThroughEnabled && (ModifierKeys & Keys.Alt) != Keys.Alt) {
+ m.Result = (IntPtr)HT.TRANSPARENT;
+ return;
+ }
+ break;
+ }
+
+ base.WndProc(ref m);
+ }
+
+ #endregion
+
+ #region Keyboard event handling
+
+ protected override void OnKeyUp(KeyEventArgs e) {
+ base.OnKeyUp(e);
+
+ //ALT
+ if (e.Modifiers == Keys.Alt) {
+ if (e.KeyCode == Keys.Enter) {
+ e.Handled = true;
+ FullscreenManager.Toggle();
+ }
+
+ else if (e.KeyCode == Keys.D1 || e.KeyCode == Keys.NumPad1) {
+ FitToThumbnail(0.25);
+ }
+
+ else if (e.KeyCode == Keys.D2 || e.KeyCode == Keys.NumPad2) {
+ FitToThumbnail(0.5);
+ }
+
+ else if (e.KeyCode == Keys.D3 || e.KeyCode == Keys.NumPad3 ||
+ e.KeyCode == Keys.D0 || e.KeyCode == Keys.NumPad0) {
+ FitToThumbnail(1.0);
+ }
+
+ else if (e.KeyCode == Keys.D4 || e.KeyCode == Keys.NumPad4) {
+ FitToThumbnail(2.0);
+ }
+ }
+
+ //F11 Fullscreen switch
+ else if (e.KeyCode == Keys.F11) {
+ e.Handled = true;
+ FullscreenManager.Toggle();
+ }
+
+ //ESCAPE
+ else if (e.KeyCode == Keys.Escape) {
+ //Disable click-through
+ if (ClickThroughEnabled) {
+ ClickThroughEnabled = false;
+ }
+ //Toggle fullscreen
+ else if (FullscreenManager.IsFullscreen) {
+ FullscreenManager.SwitchBack();
+ }
+ //Disable click forwarding
+ else if (ClickForwardingEnabled) {
+ ClickForwardingEnabled = false;
+ }
+ }
+ }
+
+ #endregion
+
+ #region Thumbnail operation
+
+ ///
+ /// Sets a new thumbnail.
+ ///
+ /// Handle to the window to clone.
+ /// Region of the window to clone or null.
+ public void SetThumbnail(WindowHandle handle, ThumbnailRegion region) {
+ try {
+ System.Diagnostics.Trace.WriteLine(string.Format("Cloning window HWND {0} of class {1}.", handle.Handle, handle.Class));
+
+ CurrentThumbnailWindowHandle = handle;
+ _thumbnailPanel.SetThumbnailHandle(handle, region);
+
+ //Set aspect ratio (this will resize the form), do not refresh if in fullscreen
+ SetAspectRatio(_thumbnailPanel.ThumbnailPixelSize, !FullscreenManager.IsFullscreen);
+ }
+ catch (Exception ex) {
+ System.Diagnostics.Trace.Fail("Unable to set thumbnail.", ex.ToString());
+
+ ThumbnailError(ex, false, Strings.ErrorUnableToCreateThumbnail);
+ _thumbnailPanel.UnsetThumbnail();
+ }
+ }
+
+ ///
+ /// Enables group mode on a list of window handles.
+ ///
+ /// List of window handles.
+ public void SetThumbnailGroup(IList handles) {
+ if (handles.Count == 0)
+ return;
+
+ //At last one thumbnail
+ SetThumbnail(handles[0], null);
+
+ //Handle if no real group
+ if (handles.Count == 1)
+ return;
+
+ CurrentThumbnailWindowHandle = null;
+ _msgPumpManager.Get().EnableGroupMode(handles);
+ }
+
+ ///
+ /// Disables the cloned thumbnail.
+ ///
+ public void UnsetThumbnail() {
+ //Unset handle
+ CurrentThumbnailWindowHandle = null;
+ _thumbnailPanel.UnsetThumbnail();
+
+ //Disable aspect ratio
+ KeepAspectRatio = false;
+ }
+
+ ///
+ /// Gets or sets the region displayed of the current thumbnail.
+ ///
+ public ThumbnailRegion SelectedThumbnailRegion {
+ get {
+ if (!_thumbnailPanel.IsShowingThumbnail || !_thumbnailPanel.ConstrainToRegion)
+ return null;
+
+ return _thumbnailPanel.SelectedRegion;
+ }
+ set {
+ if (!_thumbnailPanel.IsShowingThumbnail)
+ return;
+
+ _thumbnailPanel.SelectedRegion = value;
+
+ SetAspectRatio(_thumbnailPanel.ThumbnailPixelSize, true);
+
+ FixPositionAndSize();
+ }
+ }
+
+ const int FixMargin = 10;
+
+ ///
+ /// Fixes the form's position and size, ensuring it is fully displayed in the current screen.
+ ///
+ private void FixPositionAndSize() {
+ var screen = Screen.FromControl(this);
+
+ if (Width > screen.WorkingArea.Width) {
+ Width = screen.WorkingArea.Width - FixMargin;
+ }
+ if (Height > screen.WorkingArea.Height) {
+ Height = screen.WorkingArea.Height - FixMargin;
+ }
+ if (Location.X + Width > screen.WorkingArea.Right) {
+ Location = new Point(screen.WorkingArea.Right - Width - FixMargin, Location.Y);
+ }
+ if (Location.Y + Height > screen.WorkingArea.Bottom) {
+ Location = new Point(Location.X, screen.WorkingArea.Bottom - Height - FixMargin);
+ }
+ }
+
+ private void ThumbnailError(Exception ex, bool suppress, string title) {
+ if (!suppress) {
+ ShowErrorDialog(title, Strings.ErrorGenericThumbnailHandleError, ex.Message);
+ }
+
+ UnsetThumbnail();
+ }
+
+ /// Automatically sizes the window in order to accomodate the thumbnail p times.
+ /// Scale of the thumbnail to consider.
+ private void FitToThumbnail(double p) {
+ try {
+ Size originalSize = _thumbnailPanel.ThumbnailPixelSize;
+ Size fittedSize = new Size((int)(originalSize.Width * p), (int)(originalSize.Height * p));
+ ClientSize = fittedSize;
+ RefreshScreenLock();
+ }
+ catch (Exception ex) {
+ ThumbnailError(ex, false, Strings.ErrorUnableToFit);
+ }
+ }
+
+ #endregion
+
+ #region Accessors
+
+ ///
+ /// Gets the form's thumbnail panel.
+ ///
+ public ThumbnailPanel ThumbnailPanel {
+ get {
+ return _thumbnailPanel;
+ }
+ }
+
+ ///
+ /// Gets the form's message pump manager.
+ ///
+ public MessagePumpManager MessagePumpManager {
+ get {
+ return _msgPumpManager;
+ }
+ }
+
+ ///
+ /// Gets the form's window list drop down menu.
+ ///
+ public ContextMenuStrip MenuWindows {
+ get {
+ return menuWindows;
+ }
+ }
+
+ ///
+ /// Retrieves the window handle of the currently cloned thumbnail.
+ ///
+ public WindowHandle CurrentThumbnailWindowHandle {
+ get;
+ private set;
+ }
+
+ #endregion
+
+ }
+}
diff --git a/OnTopReplica/MainForm_Gui.cs b/OnTopReplica/MainForm_Gui.cs
index e69de29..fe909cb 100644
--- a/OnTopReplica/MainForm_Gui.cs
+++ b/OnTopReplica/MainForm_Gui.cs
@@ -0,0 +1,118 @@
+using System.Drawing;
+using System.Windows.Forms;
+using WindowsFormsAero.TaskDialog;
+
+namespace OnTopReplica {
+ partial class MainForm {
+
+ ///
+ /// Opens the context menu.
+ ///
+ /// Optional position of the mouse, relative to which the menu is shown.
+ public void OpenContextMenu(Point? position) {
+ Point menuPosition = MousePosition;
+ if (position.HasValue)
+ menuPosition = position.Value;
+
+ if (FullscreenManager.IsFullscreen) {
+ menuFullscreenContext.Show(menuPosition);
+ }
+ else {
+ menuContext.Show(menuPosition);
+ }
+ }
+
+ ///
+ /// Gets the window's vertical chrome size.
+ ///
+ public int ChromeBorderVertical {
+ get {
+ if (IsChromeVisible)
+ return SystemInformation.FrameBorderSize.Height;
+ else
+ return 0;
+ }
+ }
+
+ ///
+ /// Gets the window's horizontal chrome size.
+ ///
+ public int ChromeBorderHorizontal {
+ get {
+ if (IsChromeVisible)
+ return SystemInformation.FrameBorderSize.Width;
+ else
+ return 0;
+ }
+ }
+
+ ///
+ /// Displays an error task dialog.
+ ///
+ /// Main instruction of the error dialog.
+ /// Detailed informations about the error.
+ /// Expanded error codes/messages.
+ private void ShowErrorDialog(string mainInstruction, string explanation, string errorMessage) {
+ TaskDialog dlg = new TaskDialog(mainInstruction, Strings.ErrorGenericTitle, explanation) {
+ CommonIcon = TaskDialogIcon.Stop,
+ IsExpanded = false
+ };
+
+ if (!string.IsNullOrEmpty(errorMessage)) {
+ dlg.ExpandedInformation = Strings.ErrorGenericInfoText + errorMessage;
+ dlg.ExpandedControlText = Strings.ErrorGenericInfoButton;
+ }
+
+ dlg.Show(this);
+ }
+
+ ///
+ /// Ensures that the main form is visible (either closing the fullscreen mode or reactivating from task icon).
+ ///
+ public void EnsureMainFormVisible() {
+ //Reset special modes
+ FullscreenManager.SwitchBack();
+ ClickThroughEnabled = false;
+ Opacity = 1.0;
+
+ //Restore main form in a platform-dependent method
+ Program.Platform.RestoreForm(this);
+ }
+
+ ///
+ /// Opens a confirmation dialog to confirm whether to reset the main form or not.
+ ///
+ public void ResetMainFormWithConfirmation() {
+ var dlg = new TaskDialog(Strings.AskReset, Strings.AskResetTitle, Strings.AskResetContent);
+ dlg.UseCommandLinks = true;
+ dlg.CustomButtons = new CustomButton[] {
+ new CustomButton(Result.OK, Strings.AskResetButtonOk),
+ new CustomButton(Result.Cancel, Strings.ButtonCancel)
+ };
+ dlg.CommonIcon = TaskDialogIcon.Information;
+
+ if (dlg.Show(this).CommonButton == Result.OK) {
+ ResetMainForm();
+ }
+ }
+
+ ///
+ /// Resets the main form to its initial state.
+ ///
+ public void ResetMainForm() {
+ //Reset form settings
+ UnsetThumbnail();
+ CloseSidePanel();
+
+ //Reset location and size (edge of the screen, min size)
+ Point nuLoc = Screen.PrimaryScreen.WorkingArea.Location;
+ nuLoc.Offset(40, 40);
+ Location = nuLoc;
+ Size = new Size(240, 220);
+
+ this.Show();
+ this.Activate();
+ }
+
+ }
+}
diff --git a/OnTopReplica/MainForm_MenuEvents.cs b/OnTopReplica/MainForm_MenuEvents.cs
index e69de29..eb9ad0c 100644
--- a/OnTopReplica/MainForm_MenuEvents.cs
+++ b/OnTopReplica/MainForm_MenuEvents.cs
@@ -0,0 +1,203 @@
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using OnTopReplica.Properties;
+using WindowsFormsAero.TaskDialog;
+using OnTopReplica.SidePanels;
+
+namespace OnTopReplica {
+ partial class MainForm {
+
+ private void Menu_opening(object sender, CancelEventArgs e) {
+ //Cancel if currently in "fullscreen" mode or a side panel is open
+ if (FullscreenManager.IsFullscreen || IsSidePanelOpen) {
+ e.Cancel = true;
+ return;
+ }
+
+ bool showing = _thumbnailPanel.IsShowingThumbnail;
+
+ selectRegionToolStripMenuItem.Enabled = showing;
+ switchToWindowToolStripMenuItem.Enabled = showing;
+ resizeToolStripMenuItem.Enabled = showing;
+ chromeToolStripMenuItem.Checked = IsChromeVisible;
+ clickForwardingToolStripMenuItem.Checked = ClickForwardingEnabled;
+ chromeToolStripMenuItem.Enabled = showing;
+ clickThroughToolStripMenuItem.Enabled = showing;
+ clickForwardingToolStripMenuItem.Enabled = showing;
+ }
+
+ private void Menu_Switch_click(object sender, EventArgs e) {
+ if (CurrentThumbnailWindowHandle == null)
+ return;
+
+ Program.Platform.HideForm(this);
+ Native.WindowManagerMethods.SetForegroundWindow(CurrentThumbnailWindowHandle.Handle);
+ }
+
+ private void Menu_Advanced_opening(object sender, EventArgs e) {
+ restoreLastClonedWindowToolStripMenuItem.Checked = Settings.Default.RestoreLastWindow;
+ }
+
+ private void Menu_GroupSwitchMode_click(object sender, EventArgs e) {
+ SetSidePanel(new SidePanels.GroupSwitchPanel());
+ }
+
+ private void Menu_RestoreLastWindow_click(object sender, EventArgs e) {
+ Settings.Default.RestoreLastWindow = !Settings.Default.RestoreLastWindow;
+ }
+
+ private void Menu_ClickForwarding_click(object sender, EventArgs e) {
+ ClickForwardingEnabled = !ClickForwardingEnabled;
+ }
+
+ private void Menu_ClickThrough_click(object sender, EventArgs e) {
+ ClickThroughEnabled = true;
+ }
+
+ private void Menu_Opacity_opening(object sender, CancelEventArgs e) {
+ ToolStripMenuItem[] items = {
+ toolStripMenuItem1,
+ toolStripMenuItem2,
+ toolStripMenuItem3,
+ toolStripMenuItem4
+ };
+
+ foreach (ToolStripMenuItem i in items) {
+ if (((double)i.Tag) == this.Opacity)
+ i.Checked = true;
+ else
+ i.Checked = false;
+ }
+ }
+
+ private void Menu_Opacity_click(object sender, EventArgs e) {
+ //Get clicked menu item
+ ToolStripMenuItem tsi = sender as ToolStripMenuItem;
+
+ if (tsi != null && this.Visible) {
+ //Get opacity from the tag
+ this.Opacity = (double)tsi.Tag;
+ Program.Platform.OnFormStateChange(this);
+ }
+ }
+
+ private void Menu_Region_click(object sender, EventArgs e) {
+ SetSidePanel(new OnTopReplica.SidePanels.RegionPanel());
+ }
+
+ private void Menu_Resize_opening(object sender, CancelEventArgs e) {
+ if (!_thumbnailPanel.IsShowingThumbnail)
+ e.Cancel = true;
+
+ restorePositionAndSizeToolStripMenuItem.Checked = Settings.Default.RestoreSizeAndPosition;
+ }
+
+ private void Menu_Resize_Double(object sender, EventArgs e) {
+ FitToThumbnail(2.0);
+ }
+
+ private void Menu_Resize_FitToWindow(object sender, EventArgs e) {
+ FitToThumbnail(1.0);
+ }
+
+ private void Menu_Resize_Half(object sender, EventArgs e) {
+ FitToThumbnail(0.5);
+ }
+
+ private void Menu_Resize_Quarter(object sender, EventArgs e) {
+ FitToThumbnail(0.25);
+ }
+
+ private void Menu_Resize_Fullscreen(object sender, EventArgs e) {
+ FullscreenManager.SwitchFullscreen();
+ }
+
+ private void Menu_Resize_RecallPosition_click(object sender, EventArgs e) {
+ Settings.Default.RestoreSizeAndPosition = !Settings.Default.RestoreSizeAndPosition;
+ }
+
+ private void Menu_Position_Opening(object sender, EventArgs e) {
+ disabledToolStripMenuItem.Checked = (PositionLock == null);
+ topLeftToolStripMenuItem.Checked = (PositionLock == ScreenPosition.TopLeft);
+ topRightToolStripMenuItem.Checked = (PositionLock == ScreenPosition.TopRight);
+ centerToolStripMenuItem.Checked = (PositionLock == ScreenPosition.Center);
+ bottomLeftToolStripMenuItem.Checked = (PositionLock == ScreenPosition.BottomLeft);
+ bottomRightToolStripMenuItem.Checked = (PositionLock == ScreenPosition.BottomRight);
+ }
+
+ private void Menu_Position_Disable(object sender, EventArgs e) {
+ PositionLock = null;
+ }
+
+ private void Menu_Position_TopLeft(object sender, EventArgs e) {
+ PositionLock = ScreenPosition.TopLeft;
+ }
+
+ private void Menu_Position_TopRight(object sender, EventArgs e) {
+ PositionLock = ScreenPosition.TopRight;
+ }
+
+ private void Menu_Position_Center(object sender, EventArgs e) {
+ PositionLock = ScreenPosition.Center;
+ }
+
+ private void Menu_Position_BottomLeft(object sender, EventArgs e) {
+ PositionLock = ScreenPosition.BottomLeft;
+ }
+
+ private void Menu_Position_BottomRight(object sender, EventArgs e) {
+ PositionLock = ScreenPosition.BottomRight;
+ }
+
+ private void Menu_Reduce_click(object sender, EventArgs e) {
+ //Hide form in a platform specific way
+ Program.Platform.HideForm(this);
+ }
+
+ private void Menu_Chrome_click(object sender, EventArgs e) {
+ IsChromeVisible = !IsChromeVisible;
+ }
+
+ private void Menu_Settings_click(object sender, EventArgs e) {
+ this.SetSidePanel(new OptionsPanel());
+ }
+
+ private void Menu_About_click(object sender, EventArgs e) {
+ this.SetSidePanel(new AboutPanel());
+ }
+
+ private void Menu_Close_click(object sender, EventArgs e) {
+ this.Close();
+ }
+
+ private void Menu_Fullscreen_ExitFullscreen_click(object sender, EventArgs e) {
+ FullscreenManager.SwitchBack();
+ }
+
+ private void Menu_Fullscreen_Mode_opening(object sender, EventArgs e) {
+ var mode = Settings.Default.GetFullscreenMode();
+
+ menuModeStandardToolStripMenuItem.Checked = (mode == FullscreenMode.Standard);
+ menuModeFullscreenToolStripMenuItem.Checked = (mode == FullscreenMode.Fullscreen);
+ menuModeAllScreensToolStripMenuItem.Checked = (mode == FullscreenMode.AllScreens);
+ }
+
+ private void Menu_Fullscreen_Mode_Standard_click(object sender, EventArgs e) {
+ Settings.Default.SetFullscreenMode(FullscreenMode.Standard);
+ FullscreenManager.SwitchFullscreen(FullscreenMode.Standard);
+ }
+
+ private void Menu_Fullscreen_Mode_Fullscreen_click(object sender, EventArgs e) {
+ Settings.Default.SetFullscreenMode(FullscreenMode.Fullscreen);
+ FullscreenManager.SwitchFullscreen(FullscreenMode.Fullscreen);
+ }
+
+ private void Menu_Fullscreen_Mode_AllScreens_click(object sender, EventArgs e) {
+ Settings.Default.SetFullscreenMode(FullscreenMode.AllScreens);
+ FullscreenManager.SwitchFullscreen(FullscreenMode.AllScreens);
+ }
+
+ }
+}
diff --git a/OnTopReplica/MessagePumpProcessors/HotKeyManager.cs b/OnTopReplica/MessagePumpProcessors/HotKeyManager.cs
index e69de29..ab68d38 100644
--- a/OnTopReplica/MessagePumpProcessors/HotKeyManager.cs
+++ b/OnTopReplica/MessagePumpProcessors/HotKeyManager.cs
@@ -0,0 +1,167 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Windows.Forms;
+using OnTopReplica.Native;
+using OnTopReplica.Properties;
+
+namespace OnTopReplica.MessagePumpProcessors {
+
+ ///
+ /// HotKey registration helper.
+ ///
+ class HotKeyManager : BaseMessagePumpProcessor {
+
+ public HotKeyManager() {
+ Enabled = true;
+ }
+
+ delegate void HotKeyHandler();
+
+ ///
+ /// Wraps hot key handler registration data.
+ ///
+ private class HotKeyHandlerRegistration : IDisposable {
+ private HotKeyHandlerRegistration() {
+ }
+
+ private HotKeyHandlerRegistration(IntPtr hwnd, int key, HotKeyHandler handler) {
+ if (hwnd == IntPtr.Zero)
+ throw new ArgumentException();
+ if (handler == null)
+ throw new ArgumentNullException();
+
+ _hwnd = hwnd;
+ RegistrationKey = key;
+ Handler = handler;
+ }
+
+ static int _lastUsedKey = 0;
+
+ ///
+ /// Registers a new hotkey and returns a handle to the registration.
+ ///
+ /// Returns null on failure.
+ public static HotKeyHandlerRegistration Register(Form owner, int keyCode, int modifiers, HotKeyHandler handler) {
+ var key = ++_lastUsedKey;
+
+ if (!HotKeyMethods.RegisterHotKey(owner.Handle, key, modifiers, keyCode)) {
+ Console.Error.WriteLine("Failed to create hotkey on keys {0}.", keyCode);
+ return null;
+ }
+
+ return new HotKeyHandlerRegistration(owner.Handle, key, handler);
+ }
+
+ IntPtr _hwnd;
+ public int RegistrationKey { get; private set; }
+ public HotKeyHandler Handler { get; private set; }
+
+ public void Dispose() {
+ if (!HotKeyMethods.UnregisterHotKey(_hwnd, RegistrationKey)) {
+ Console.Error.WriteLine("Failed to unregister hotkey #{0}.", RegistrationKey);
+ }
+ }
+ }
+
+ Dictionary _handlers = new Dictionary();
+
+ public override void Initialize(MainForm form) {
+ base.Initialize(form);
+
+ RefreshHotkeys();
+ }
+
+ public override bool Process(ref Message msg) {
+ if (Enabled && msg.Msg == HotKeyMethods.WM_HOTKEY) {
+ int keyId = msg.WParam.ToInt32();
+ if (!_handlers.ContainsKey(keyId))
+ return false;
+
+ _handlers[keyId].Handler.Invoke();
+ }
+
+ return false;
+ }
+
+ public bool Enabled { get; set; }
+
+ ///
+ /// Refreshes registered hotkeys from Settings.
+ ///
+ ///
+ /// Application settings contain hotkey registration strings that are used
+ /// automatically by this registration process.
+ ///
+ public void RefreshHotkeys() {
+ ClearHandlers();
+
+ RegisterHandler(Settings.Default.HotKeyCloneCurrent, HotKeyCloneHandler);
+ RegisterHandler(Settings.Default.HotKeyShowHide, HotKeyShowHideHandler);
+ }
+
+ private void RegisterHandler(string spec, HotKeyHandler handler) {
+ if (string.IsNullOrEmpty(spec))
+ return; //this can happen and is allowed => simply don't register
+ if (handler == null)
+ throw new ArgumentNullException();
+
+ int modifiers = 0, keyCode = 0;
+
+ try {
+ HotKeyMethods.TranslateStringToKeyValues(spec, out modifiers, out keyCode);
+ }
+ catch (ArgumentException) {
+ //TODO: swallowed exception
+ return;
+ }
+
+ var reg = HotKeyHandlerRegistration.Register(Form, keyCode, modifiers, handler);
+ if(reg != null)
+ _handlers.Add(reg.RegistrationKey, reg);
+ }
+
+ private void ClearHandlers() {
+ foreach (var hotkey in _handlers) {
+ hotkey.Value.Dispose();
+ }
+ _handlers.Clear();
+ }
+
+ protected override void Shutdown() {
+ ClearHandlers();
+ }
+
+ #region Hotkey callbacks
+
+ ///
+ /// Handles "show/hide" hotkey. Ensures the form is in restored state and switches
+ /// between shown and hidden states.
+ ///
+ void HotKeyShowHideHandler() {
+ Form.FullscreenManager.SwitchBack();
+
+ if (!Program.Platform.IsHidden(Form)) {
+ Program.Platform.HideForm(Form);
+ }
+ else {
+ Form.EnsureMainFormVisible();
+ }
+ }
+
+ ///
+ /// Handles the "clone current" hotkey.
+ ///
+ void HotKeyCloneHandler() {
+ var handle = Win32Helper.GetCurrentForegroundWindow();
+ if (handle.Handle == Form.Handle)
+ return;
+
+ Form.SetThumbnail(handle, null);
+ }
+
+ #endregion
+
+ }
+
+}
diff --git a/OnTopReplica/OnTopReplica.csproj b/OnTopReplica/OnTopReplica.csproj
index e69de29..0f3f4cf 100644
--- a/OnTopReplica/OnTopReplica.csproj
+++ b/OnTopReplica/OnTopReplica.csproj
@@ -0,0 +1,536 @@
+
+
+
+ Debug
+ AnyCPU
+ 9.0.30729
+ 2.0
+ {E626BD6E-BF38-4EB7-A128-5CA6F40EF557}
+ WinExe
+ Properties
+ OnTopReplica
+ OnTopReplica
+ v4.0
+ 512
+ Assets\icon-new.ico
+ false
+ false
+ Internet
+ OnTopReplica.Program
+
+
+ false
+ A305A505E19CF40E069521C80C13AB3C900EDB7C
+ OnTopReplica_1_TemporaryKey.pfx
+ false
+
+
+
+
+ 3.5
+
+
+
+ publish\
+ true
+ Disk
+ true
+ Background
+ 1
+ Weeks
+ true
+ false
+ true
+ http://www.klopfenstein.net/public/Uploads/ontopreplica/
+ http://www.klopfenstein.net/lorenz.aspx/ontopreplica
+ en
+ OnTopReplica
+ Lorenz Cuno Klopfenstein
+ true
+ publish.htm
+ false
+ 0
+ 3.4.0.%2a
+ false
+ true
+ true
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ false
+ true
+
+
+ pdbonly
+ true
+ bin\Release\
+
+
+ prompt
+ 4
+
+
+ true
+ false
+
+
+
+
+
+
+
+
+ OnTopReplica.exe.manifest
+
+
+
+
+
+
+
+
+ ..\Lib\WindowsFormsAero.dll
+
+
+
+
+ Form
+
+
+
+
+
+
+
+ Component
+
+
+ Component
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+ Form
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ True
+ True
+ Resources.resx
+
+
+ True
+ True
+ Settings.settings
+
+
+ Form
+
+
+ SidePanelContainer.cs
+
+
+ UserControl
+
+
+ AboutPanel.cs
+
+
+ UserControl
+
+
+ AboutPanelContents.cs
+
+
+ UserControl
+
+
+ OptionsPanel.cs
+
+
+ UserControl
+
+
+ GroupSwitchPanel.cs
+
+
+
+
+ True
+ True
+ Strings.resx
+
+
+
+
+
+
+
+
+
+
+
+
+ SidePanelContainer.cs
+
+
+ AboutPanel.cs
+
+
+ AboutPanelContents.cs
+
+
+ ResXFileCodeGenerator
+ Strings.pl.Designer.cs
+
+
+ ResXFileCodeGenerator
+ Strings.Designer.cs
+
+
+ ResXFileCodeGenerator
+ Strings.ru.Designer.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UserControl
+
+
+
+ Form
+
+
+ CommandLineReportForm.cs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Component
+
+
+ Form
+
+
+ MainForm.cs
+
+
+
+
+
+ GroupSwitchPanel.cs
+
+
+ OptionsPanel.cs
+
+
+ CommandLineReportForm.cs
+
+
+ ResXFileCodeGenerator
+ Strings.cs.Designer.cs
+
+
+ ResXFileCodeGenerator
+ Strings.da.Designer.cs
+
+
+ ResXFileCodeGenerator
+ Strings.de.Designer.cs
+
+
+ ResXFileCodeGenerator
+ Strings.es.Designer.cs
+
+
+ ResXFileCodeGenerator
+ Strings.fi.Designer.cs
+
+
+ ResXFileCodeGenerator
+ Strings.it.Designer.cs
+ Designer
+
+
+ MainForm.cs
+ Designer
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ RegionPanel.cs
+ Designer
+
+
+ ResXFileCodeGenerator
+ Strings.no.Designer.cs
+
+
+ ResXFileCodeGenerator
+ Strings.pt-BR.Designer.cs
+
+
+ ResXFileCodeGenerator
+ Strings.pt.Designer.cs
+
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ UserControl
+
+
+ RegionPanel.cs
+
+
+
+
+ Component
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Always
+
+
+ Always
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+ .NET Framework 3.5 SP1 Client Profile
+ false
+
+
+ False
+ .NET Framework 2.0 %28x86%29
+ true
+
+
+ False
+ .NET Framework 3.0 %28x86%29
+ false
+
+
+ False
+ .NET Framework 3.5
+ false
+
+
+ False
+ .NET Framework 3.5 SP1
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+ Exclude
+ True
+ File
+
+
+ False
+
+
+
+
+ Exclude
+ True
+ File
+
+
+ False
+
+
+
+
+ Exclude
+ True
+ File
+
+
+ False
+
+
+
+
+ Exclude
+ True
+ File
+
+
+ False
+
+
+
+
+ Include
+ True
+ Satellite
+
+
+ False
+
+
+
+
+ Include
+ True
+ Satellite
+
+
+ False
+
+
+
+
+ Include
+ True
+ Satellite
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/OnTopReplica/Platforms/WindowsSeven.cs b/OnTopReplica/Platforms/WindowsSeven.cs
index e69de29..c24ee7c 100644
--- a/OnTopReplica/Platforms/WindowsSeven.cs
+++ b/OnTopReplica/Platforms/WindowsSeven.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Windows.Forms;
+using OnTopReplica.Native;
+using WindowsFormsAero.Dwm;
+
+namespace OnTopReplica.Platforms {
+
+ class WindowsSeven : WindowsVista {
+
+ public override void PreHandleFormInit() {
+ //Set Application ID
+ WindowsSevenMethods.SetCurrentProcessExplicitAppUserModelID("LorenzCunoKlopfenstein.OnTopReplica.MainForm");
+ }
+
+ public override void PostHandleFormInit(MainForm form) {
+ DwmManager.SetWindowFlip3dPolicy(form, Flip3DPolicy.ExcludeAbove);
+ DwmManager.SetExcludeFromPeek(form, true);
+ DwmManager.SetDisallowPeek(form, true);
+ }
+
+ public override void HideForm(MainForm form) {
+ form.Opacity = 0;
+ }
+
+ public override bool IsHidden(MainForm form) {
+ return (form.Opacity == 0.0);
+ }
+
+ public override void RestoreForm(MainForm form) {
+ if (form.Opacity == 0.0)
+ form.Opacity = 1.0;
+
+ form.Show();
+ }
+
+ /*public override void OnFormStateChange(MainForm form) {
+ //SetWindowStyle(form);
+ }*/
+
+ ///
+ /// Used to alter the window style. Not used anymore.
+ ///
+ private void SetWindowStyle(MainForm form) {
+ if (!form.FullscreenManager.IsFullscreen) {
+ //This hides the app from ALT+TAB
+ //Note that when minimized, it will be shown as an (ugly) minimized tool window
+ //thus we do not minimize, but set to transparent when hiding
+ long exStyle = WindowMethods.GetWindowLong(form.Handle, WindowMethods.WindowLong.ExStyle).ToInt64();
+
+ exStyle |= (long)(WindowMethods.WindowExStyles.ToolWindow);
+ //exStyle &= ~(long)(WindowMethods.WindowExStyles.AppWindow);
+
+ WindowMethods.SetWindowLong(form.Handle, WindowMethods.WindowLong.ExStyle, new IntPtr(exStyle));
+
+ //WindowMethods.SetWindowLong(form.Handle, WindowMethods.WindowLong.HwndParent, WindowManagerMethods.GetDesktopWindow());
+ }
+ }
+
+ }
+
+}
diff --git a/OnTopReplica/Properties/Resources.resx b/OnTopReplica/Properties/Resources.resx
index e69de29..d5899e8 100644
--- a/OnTopReplica/Properties/Resources.resx
+++ b/OnTopReplica/Properties/Resources.resx
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+
+ ..\Assets\flag_ita.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\xiao_add.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\x-oblique.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\component.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\25.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\window_multiple16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\xiao_delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\regions_new.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\pos_null.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\window_opacity_new.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\pos_topleft.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\pos_bottomleft.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\pos_topright.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\clickforwarding.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\newicon.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\back.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\xiao_up.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\window16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\flag_czech.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\pos_bottomright.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\window_switch.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\desktop.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\flag_danish.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\xiao_ok.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\xiao_wrench.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\list.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\icon-new.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\fullscreen.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\xiao_down.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\xiao_arrow.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\window_border16.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\flag_usa.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\groupmode.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\pos_center.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\flag_spanish.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\flag_poland.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Assets\flag_germany.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\minimize.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\help.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/OnTopReplica/Properties/Settings.settings b/OnTopReplica/Properties/Settings.settings
index e69de29..5535ca5 100644
--- a/OnTopReplica/Properties/Settings.settings
+++ b/OnTopReplica/Properties/Settings.settings
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+ 255
+
+
+ (Default)
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ False
+
+
+ False
+
+
+ 0, 0
+
+
+ 0, 0
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+ [CTRL]+[SHIFT]+C
+
+
+ [CTRL]+[SHIFT]+O
+
+
+ Standard
+
+
+
\ No newline at end of file
diff --git a/OnTopReplica/Resources/help.png b/OnTopReplica/Resources/help.png
index e69de29..299ccbf 100644
Binary files a/OnTopReplica/Resources/help.png and b/OnTopReplica/Resources/help.png differ
diff --git a/OnTopReplica/Resources/minimize.png b/OnTopReplica/Resources/minimize.png
index e69de29..f6684e5 100644
Binary files a/OnTopReplica/Resources/minimize.png and b/OnTopReplica/Resources/minimize.png differ
diff --git a/OnTopReplica/SidePanelContainer.Designer.cs b/OnTopReplica/SidePanelContainer.Designer.cs
index e69de29..1c6f3e1 100644
--- a/OnTopReplica/SidePanelContainer.Designer.cs
+++ b/OnTopReplica/SidePanelContainer.Designer.cs
@@ -0,0 +1,46 @@
+namespace OnTopReplica {
+ partial class SidePanelContainer {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent() {
+ this.SuspendLayout();
+ //
+ // SidePanelContainer
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(287, 346);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
+ this.MinimizeBox = false;
+ this.Name = "SidePanelContainer";
+ this.ShowInTaskbar = false;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
+ this.Text = "Side Panel container";
+ this.TopMost = true;
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/OnTopReplica/SidePanelContainer.resx b/OnTopReplica/SidePanelContainer.resx
index e69de29..29dcb1b 100644
--- a/OnTopReplica/SidePanelContainer.resx
+++ b/OnTopReplica/SidePanelContainer.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/OnTopReplica/SidePanels/AboutPanel.cs b/OnTopReplica/SidePanels/AboutPanel.cs
index e69de29..679c2d3 100644
--- a/OnTopReplica/SidePanels/AboutPanel.cs
+++ b/OnTopReplica/SidePanels/AboutPanel.cs
@@ -0,0 +1,33 @@
+using OnTopReplica.Properties;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Text;
+using System.Windows.Forms;
+using WindowsFormsAero.Dwm;
+
+namespace OnTopReplica.SidePanels {
+ partial class AboutPanel : SidePanel {
+
+ public AboutPanel() {
+ InitializeComponent();
+
+ //Display version number
+ labelVersion.Text = string.Format(Strings.AboutVersion, Application.ProductVersion);
+ }
+
+ public override string Title {
+ get {
+ return Strings.AboutTitle;
+ }
+ }
+
+ public override Margins? GlassMargins {
+ get {
+ return new Margins(0, 0, 0, labelVersion.Height);
+ }
+ }
+
+ }
+}
diff --git a/OnTopReplica/StartupOptions/Options.cs b/OnTopReplica/StartupOptions/Options.cs
index e69de29..35f1b4e 100644
--- a/OnTopReplica/StartupOptions/Options.cs
+++ b/OnTopReplica/StartupOptions/Options.cs
@@ -0,0 +1,163 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Drawing;
+using System.IO;
+using OnTopReplica.WindowSeekers;
+
+namespace OnTopReplica.StartupOptions {
+
+ ///
+ /// Represents startup options that can be set via CLI scripting (or other stuff).
+ ///
+ class Options {
+
+ public Options() {
+ Status = CliStatus.Ok;
+ Opacity = 255;
+ DisableChrome = false;
+ MustBeVisible = false;
+ Fullscreen = false;
+ }
+
+ #region Position and size
+
+ public Point? StartLocation { get; set; }
+
+ public ScreenPosition? StartPositionLock { get; set; }
+
+ public Size? StartSize { get; set; }
+
+ #endregion
+
+ #region Window cloning
+
+ public IntPtr? WindowId { get; set; }
+
+ public string WindowTitle { get; set; }
+
+ public string WindowClass { get; set; }
+
+ public ThumbnailRegion Region { get; set; }
+
+ public bool MustBeVisible { get; set; }
+
+ #endregion
+
+ #region Options
+
+ public bool EnableClickForwarding { get; set; }
+
+ public byte Opacity { get; set; }
+
+ public bool DisableChrome { get; set; }
+
+ public bool Fullscreen { get; set; }
+
+ #endregion
+
+ #region Debug info
+
+ StringBuilder _sb = new StringBuilder();
+ TextWriter _sbWriter;
+
+ public CliStatus Status { get; set; }
+
+ ///
+ /// Gets a debug message writer.
+ ///
+ public TextWriter DebugMessageWriter {
+ get {
+ if (_sbWriter == null) {
+ _sbWriter = new StringWriter(_sb);
+ }
+ return _sbWriter;
+ }
+ }
+
+ ///
+ /// Gets the debug message.
+ ///
+ public string DebugMessage {
+ get {
+ if(_sbWriter != null)
+ _sbWriter.Flush();
+ return _sb.ToString();
+ }
+ }
+
+ #endregion
+
+ #region Application
+
+ public void Apply(MainForm form) {
+ //GUI
+ form.IsChromeVisible = !DisableChrome;
+ form.Opacity = (double)Opacity / 255.0;
+
+ //Seek handle for thumbnail cloning
+ WindowHandle handle = null;
+ if (WindowId.HasValue) {
+ handle = WindowHandle.FromHandle(WindowId.Value);
+ }
+ else if (WindowTitle != null) {
+ var seeker = new ByTitleWindowSeeker(WindowTitle) {
+ OwnerHandle = form.Handle,
+ SkipNotVisibleWindows = MustBeVisible
+ };
+ seeker.Refresh();
+
+ handle = seeker.Windows.FirstOrDefault();
+ }
+ else if (WindowClass != null) {
+ var seeker = new ByClassWindowSeeker(WindowClass) {
+ OwnerHandle = form.Handle,
+ SkipNotVisibleWindows = MustBeVisible
+ };
+ seeker.Refresh();
+
+ handle = seeker.Windows.FirstOrDefault();
+ }
+
+ //Position lock
+ if (StartPositionLock.HasValue) {
+ form.PositionLock = StartPositionLock.Value;
+ }
+
+ //Size and location start values
+ if (StartLocation.HasValue && StartSize.HasValue) {
+ form.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
+ form.Location = StartLocation.Value;
+ form.ClientSize = StartSize.Value;
+ }
+ else if (StartLocation.HasValue) {
+ form.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultBounds;
+ form.Location = StartLocation.Value;
+ }
+ else if (StartSize.HasValue) {
+ form.StartPosition = System.Windows.Forms.FormStartPosition.WindowsDefaultLocation;
+ form.ClientSize = StartSize.Value;
+ }
+
+ //Clone any found handle
+ if (handle != null) {
+ form.SetThumbnail(handle, Region);
+ }
+
+ //Other features
+ if (EnableClickForwarding) {
+ form.ClickForwardingEnabled = true;
+ }
+
+ //Fullscreen
+ if (Fullscreen) {
+ form.FullscreenManager.SwitchFullscreen();
+ }
+ }
+
+ #endregion
+
+ }
+
+}
diff --git a/OnTopReplica/app.config b/OnTopReplica/app.config
index e69de29..06326b9 100644
--- a/OnTopReplica/app.config
+++ b/OnTopReplica/app.config
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+ 255
+
+
+ (Default)
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ True
+
+
+ False
+
+
+ False
+
+
+ 0, 0
+
+
+ 0, 0
+
+
+ False
+
+
+
+
+
+
+
+
+ 0
+
+
+ [CTRL]+[SHIFT]+C
+
+
+ [CTRL]+[SHIFT]+O
+
+
+ Standard
+
+
+
+