mirror of
https://github.com/LorenzCK/OnTopReplica.git
synced 2024-05-21 04:43:55 +12:00
Finalized command line parser implementation.
Window seeking by class implemented and /visible parameter added to CLI (picks only visible windows). Settings updated to include "restore size and position". GUI and logic updated. Fixed chrome toggling (form size and position doesn't change when switching).
This commit is contained in:
parent
295b40ece9
commit
cecbc76c67
47
OnTopReplica/MainForm.Designer.cs
generated
47
OnTopReplica/MainForm.Designer.cs
generated
|
@ -52,6 +52,8 @@
|
|||
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();
|
||||
|
@ -269,53 +271,68 @@
|
|||
this.halfToolStripMenuItem1,
|
||||
this.quarterToolStripMenuItem1,
|
||||
this.toolStripSeparator3,
|
||||
this.fullscreenToolStripMenuItem1});
|
||||
this.fullscreenToolStripMenuItem1,
|
||||
this.toolStripSeparator2,
|
||||
this.restorePositionAndSizeToolStripMenuItem});
|
||||
this.menuResize.Name = "menuResize";
|
||||
this.menuResize.OwnerItem = this.resizeToolStripMenuItem;
|
||||
this.menuResize.Size = new System.Drawing.Size(165, 120);
|
||||
this.menuResize.Size = new System.Drawing.Size(218, 170);
|
||||
this.menuResize.Opening += new System.ComponentModel.CancelEventHandler(this.Menu_Resize_opening);
|
||||
//
|
||||
// doubleToolStripMenuItem1
|
||||
//
|
||||
this.doubleToolStripMenuItem1.Name = "doubleToolStripMenuItem1";
|
||||
this.doubleToolStripMenuItem1.Size = new System.Drawing.Size(164, 22);
|
||||
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(164, 22);
|
||||
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(164, 22);
|
||||
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(164, 22);
|
||||
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(161, 6);
|
||||
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(164, 22);
|
||||
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[] {
|
||||
|
@ -337,7 +354,7 @@
|
|||
this.disabledToolStripMenuItem.Checked = true;
|
||||
this.disabledToolStripMenuItem.CheckState = System.Windows.Forms.CheckState.Checked;
|
||||
this.disabledToolStripMenuItem.Name = "disabledToolStripMenuItem";
|
||||
this.disabledToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
||||
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);
|
||||
//
|
||||
|
@ -345,7 +362,7 @@
|
|||
//
|
||||
this.topLeftToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_topleft;
|
||||
this.topLeftToolStripMenuItem.Name = "topLeftToolStripMenuItem";
|
||||
this.topLeftToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
||||
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);
|
||||
//
|
||||
|
@ -353,7 +370,7 @@
|
|||
//
|
||||
this.topRightToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_topright;
|
||||
this.topRightToolStripMenuItem.Name = "topRightToolStripMenuItem";
|
||||
this.topRightToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
||||
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);
|
||||
//
|
||||
|
@ -361,7 +378,7 @@
|
|||
//
|
||||
this.centerToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_center;
|
||||
this.centerToolStripMenuItem.Name = "centerToolStripMenuItem";
|
||||
this.centerToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
||||
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);
|
||||
//
|
||||
|
@ -369,7 +386,7 @@
|
|||
//
|
||||
this.bottomLeftToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_bottomleft;
|
||||
this.bottomLeftToolStripMenuItem.Name = "bottomLeftToolStripMenuItem";
|
||||
this.bottomLeftToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
||||
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);
|
||||
//
|
||||
|
@ -377,7 +394,7 @@
|
|||
//
|
||||
this.bottomRightToolStripMenuItem.Image = global::OnTopReplica.Properties.Resources.pos_bottomright;
|
||||
this.bottomRightToolStripMenuItem.Name = "bottomRightToolStripMenuItem";
|
||||
this.bottomRightToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
|
||||
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);
|
||||
//
|
||||
|
@ -594,6 +611,8 @@
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,9 @@ namespace OnTopReplica {
|
|||
Panel _sidePanelContainer;
|
||||
|
||||
//Managers
|
||||
BaseWindowSeeker _windowSeeker = new TaskWindowSeeker();
|
||||
BaseWindowSeeker _windowSeeker = new TaskWindowSeeker {
|
||||
SkipNotVisibleWindows = true
|
||||
};
|
||||
MessagePumpManager _msgPumpManager = new MessagePumpManager();
|
||||
UpdateManager _updateManager = new UpdateManager();
|
||||
|
||||
|
|
|
@ -68,22 +68,18 @@ namespace OnTopReplica {
|
|||
}
|
||||
set {
|
||||
if (!value) {
|
||||
Location = new Point {
|
||||
X = Location.X + SystemInformation.FrameBorderSize.Width,
|
||||
Y = Location.Y + SystemInformation.FrameBorderSize.Height
|
||||
};
|
||||
FormBorderStyle = FormBorderStyle.None;
|
||||
if (IsChromeVisible) {
|
||||
Location = new Point {
|
||||
X = Location.X + SystemInformation.FrameBorderSize.Width,
|
||||
Y = Location.Y + SystemInformation.FrameBorderSize.Height
|
||||
};
|
||||
}
|
||||
}
|
||||
else if(value) {
|
||||
Location = new Point {
|
||||
X = Location.X - SystemInformation.FrameBorderSize.Width,
|
||||
Y = Location.Y - SystemInformation.FrameBorderSize.Height
|
||||
};
|
||||
FormBorderStyle = FormBorderStyle.SizableToolWindow;
|
||||
if (!IsChromeVisible) {
|
||||
Location = new Point {
|
||||
X = Location.X - SystemInformation.FrameBorderSize.Width,
|
||||
Y = Location.Y - SystemInformation.FrameBorderSize.Height
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Program.Platform.OnFormStateChange(this);
|
||||
|
|
|
@ -109,6 +109,8 @@ namespace OnTopReplica {
|
|||
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) {
|
||||
|
@ -131,6 +133,10 @@ namespace OnTopReplica {
|
|||
IsFullscreen = true;
|
||||
}
|
||||
|
||||
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);
|
||||
|
|
|
@ -137,6 +137,7 @@
|
|||
<Compile Include="Native\HT.cs" />
|
||||
<Compile Include="Pair.cs" />
|
||||
<Compile Include="WindowSeekers\BaseWindowSeeker.cs" />
|
||||
<Compile Include="WindowSeekers\ByClassWindowSeeker.cs" />
|
||||
<Compile Include="WindowSeekers\ByTitleWindowSeeker.cs" />
|
||||
<Compile Include="WindowSeekers\TaskWindowSeeker.cs" />
|
||||
<None Include="Native\ITaskBarList.cs" />
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
<EnableSecurityDebugging>false</EnableSecurityDebugging>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
|
||||
<StartArguments>/windowClass="OperaWindowClass"</StartArguments>
|
||||
<StartArguments>
|
||||
</StartArguments>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -82,6 +82,8 @@ namespace OnTopReplica {
|
|||
while (_languageChangeCode != null);
|
||||
|
||||
//Persist settings
|
||||
Settings.Default.RestoreLastPosition = reloadLocation;
|
||||
Settings.Default.RestoreLastSize = reloadSize;
|
||||
Settings.Default.Save();
|
||||
}
|
||||
|
||||
|
|
28
OnTopReplica/Properties/Settings.Designer.cs
generated
28
OnTopReplica/Properties/Settings.Designer.cs
generated
|
@ -132,25 +132,37 @@ namespace OnTopReplica.Properties {
|
|||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
public string Setting {
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("False")]
|
||||
public bool RestoreSizeAndPosition {
|
||||
get {
|
||||
return ((string)(this["Setting"]));
|
||||
return ((bool)(this["RestoreSizeAndPosition"]));
|
||||
}
|
||||
set {
|
||||
this["Setting"] = value;
|
||||
this["RestoreSizeAndPosition"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("")]
|
||||
public string Setting1 {
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("0, 0")]
|
||||
public global::System.Drawing.Size RestoreLastSize {
|
||||
get {
|
||||
return ((string)(this["Setting1"]));
|
||||
return ((global::System.Drawing.Size)(this["RestoreLastSize"]));
|
||||
}
|
||||
set {
|
||||
this["Setting1"] = value;
|
||||
this["RestoreLastSize"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("0, 0")]
|
||||
public global::System.Drawing.Point RestoreLastPosition {
|
||||
get {
|
||||
return ((global::System.Drawing.Point)(this["RestoreLastPosition"]));
|
||||
}
|
||||
set {
|
||||
this["RestoreLastPosition"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,11 +29,14 @@
|
|||
<Setting Name="FullscreenAlwaysOnTop" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Setting" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
<Setting Name="RestoreSizeAndPosition" Type="System.Boolean" Scope="User">
|
||||
<Value Profile="(Default)">False</Value>
|
||||
</Setting>
|
||||
<Setting Name="Setting1" Type="System.String" Scope="User">
|
||||
<Value Profile="(Default)" />
|
||||
<Setting Name="RestoreLastSize" Type="System.Drawing.Size" Scope="User">
|
||||
<Value Profile="(Default)">0, 0</Value>
|
||||
</Setting>
|
||||
<Setting Name="RestoreLastPosition" Type="System.Drawing.Point" Scope="User">
|
||||
<Value Profile="(Default)">0, 0</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
|
@ -47,7 +47,7 @@
|
|||
this.labelInstruction.AutoSize = true;
|
||||
this.labelInstruction.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.labelInstruction.ForeColor = System.Drawing.SystemColors.HotTrack;
|
||||
this.labelInstruction.Location = new System.Drawing.Point(12, 9);
|
||||
this.labelInstruction.Location = new System.Drawing.Point(12, 10);
|
||||
this.labelInstruction.Name = "labelInstruction";
|
||||
this.labelInstruction.Size = new System.Drawing.Size(112, 21);
|
||||
this.labelInstruction.TabIndex = 1;
|
||||
|
|
|
@ -3,12 +3,13 @@ using System.Collections.Generic;
|
|||
using System.Text;
|
||||
using System.Drawing;
|
||||
using System.ComponentModel;
|
||||
using OnTopReplica.Properties;
|
||||
|
||||
namespace OnTopReplica.StartupOptions {
|
||||
class Factory {
|
||||
|
||||
static Factory() {
|
||||
//Custom type conversions
|
||||
//Custom type conversion attributes
|
||||
TypeDescriptor.AddAttributes(typeof(Size), new TypeConverterAttribute(typeof(SizeConverter)));
|
||||
TypeDescriptor.AddAttributes(typeof(ScreenPosition), new TypeConverterAttribute(typeof(ScreenPositionConverter)));
|
||||
TypeDescriptor.AddAttributes(typeof(Rectangle), new TypeConverterAttribute(typeof(RectangleConverter)));
|
||||
|
@ -17,11 +18,20 @@ namespace OnTopReplica.StartupOptions {
|
|||
public static Options CreateOptions(string[] args) {
|
||||
var options = new Options();
|
||||
|
||||
LoadSettings(options);
|
||||
|
||||
ParseCommandLine(args, options);
|
||||
|
||||
return options;
|
||||
}
|
||||
|
||||
private static void LoadSettings(Options options) {
|
||||
if (Settings.Default.RestoreSizeAndPosition) {
|
||||
options.StartLocation = Settings.Default.RestoreLastPosition;
|
||||
options.StartSize = Settings.Default.RestoreLastSize;
|
||||
}
|
||||
}
|
||||
|
||||
private static void ParseCommandLine(string[] args, Options options) {
|
||||
var cmdOptions = new NDesk.Options.OptionSet()
|
||||
.Add<long>("windowId=", "Window handle ({HWND}) to be cloned.", id => {
|
||||
|
@ -33,6 +43,9 @@ namespace OnTopReplica.StartupOptions {
|
|||
.Add<string>("windowClass=", "{CLASS} of the window to be cloned.", s => {
|
||||
options.WindowClass = s;
|
||||
})
|
||||
.Add("v|visible", "If set, only clones windows that are visible.", s => {
|
||||
options.MustBeVisible = true;
|
||||
})
|
||||
.Add<Size>("size=", "Target {SIZE} of the cloned thumbnail.", s => {
|
||||
options.StartSize = s;
|
||||
})
|
||||
|
@ -50,10 +63,10 @@ namespace OnTopReplica.StartupOptions {
|
|||
.Add<byte>("o|opacity=", "Opacity of the window (0-255).", opacity => {
|
||||
options.Opacity = opacity;
|
||||
})
|
||||
.Add("cf|clickForward", "Enables click forwarding.", s => {
|
||||
.Add("clickForwarding", "Enables click forwarding.", s => {
|
||||
options.EnableClickForwarding = true;
|
||||
})
|
||||
.Add("noch|chromeOff", "Disables the window's chrome (border).", s => {
|
||||
.Add("chromeOff", "Disables the window's chrome (border).", s => {
|
||||
options.DisableChrome = true;
|
||||
})
|
||||
.Add("h|help|?", "Show command line help.", s => {
|
||||
|
|
|
@ -16,6 +16,7 @@ namespace OnTopReplica.StartupOptions {
|
|||
Status = CliStatus.Ok;
|
||||
Opacity = 255;
|
||||
DisableChrome = false;
|
||||
MustBeVisible = false;
|
||||
}
|
||||
|
||||
#region Position and size
|
||||
|
@ -38,6 +39,8 @@ namespace OnTopReplica.StartupOptions {
|
|||
|
||||
public Rectangle? Region { get; set; }
|
||||
|
||||
public bool MustBeVisible { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Options
|
||||
|
@ -96,14 +99,21 @@ namespace OnTopReplica.StartupOptions {
|
|||
}
|
||||
else if (WindowTitle != null) {
|
||||
var seeker = new ByTitleWindowSeeker(WindowTitle) {
|
||||
OwnerHandle = form.Handle
|
||||
OwnerHandle = form.Handle,
|
||||
SkipNotVisibleWindows = MustBeVisible
|
||||
};
|
||||
seeker.Refresh();
|
||||
|
||||
handle = seeker.Windows.FirstOrDefault();
|
||||
}
|
||||
else if (WindowClass != null) {
|
||||
//TODO
|
||||
var seeker = new ByClassWindowSeeker(WindowClass) {
|
||||
OwnerHandle = form.Handle,
|
||||
SkipNotVisibleWindows = MustBeVisible
|
||||
};
|
||||
seeker.Refresh();
|
||||
|
||||
handle = seeker.Windows.FirstOrDefault();
|
||||
}
|
||||
if (handle != null) {
|
||||
form.SetThumbnail(handle, Region);
|
||||
|
|
|
@ -6,29 +6,41 @@ using System.Drawing;
|
|||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace OnTopReplica.StartupOptions {
|
||||
|
||||
class SizeConverter : TypeConverter {
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) {
|
||||
if (value != null) {
|
||||
var sVal = value.ToString();
|
||||
return Convert(sVal);
|
||||
return StringToSize(sVal);
|
||||
}
|
||||
else
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
|
||||
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {
|
||||
return sourceType == typeof(string);
|
||||
return (sourceType == typeof(string) || sourceType == typeof(Size));
|
||||
}
|
||||
|
||||
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) {
|
||||
return destinationType == typeof(Size);
|
||||
return (destinationType == typeof(Size) || destinationType == typeof(string));
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) {
|
||||
if (value != null && destinationType == typeof(Size)) {
|
||||
if (value == null)
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
|
||||
if (destinationType == typeof(Size)) {
|
||||
var sVal = value.ToString();
|
||||
return Convert(sVal);
|
||||
return StringToSize(sVal);
|
||||
}
|
||||
else if (destinationType == typeof(string)) {
|
||||
if (value is Size) {
|
||||
Size sValue = (Size)value;
|
||||
return string.Format("{0}, {1}", sValue.Width, sValue.Height);
|
||||
}
|
||||
|
||||
return value.ToString();
|
||||
}
|
||||
else
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
|
@ -37,7 +49,7 @@ namespace OnTopReplica.StartupOptions {
|
|||
static Regex _sizeRegex = new Regex("^\\D*(?<x>\\d*)\\s*,\\s*(?<y>\\d*)\\D*$",
|
||||
RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.Singleline);
|
||||
|
||||
private Size Convert(string s) {
|
||||
private Size StringToSize(string s) {
|
||||
var match = _sizeRegex.Match(s);
|
||||
|
||||
var x = match.Groups["x"];
|
||||
|
@ -53,4 +65,5 @@ namespace OnTopReplica.StartupOptions {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -39,6 +39,9 @@ namespace OnTopReplica.WindowSeekers {
|
|||
if (hwnd == OwnerHandle)
|
||||
return true;
|
||||
|
||||
if (SkipNotVisibleWindows && !WindowManagerMethods.IsWindowVisible(hwnd))
|
||||
return true;
|
||||
|
||||
//Extract basic properties
|
||||
string title = WindowMethods.GetWindowText(hwnd);
|
||||
|
||||
|
@ -67,6 +70,11 @@ namespace OnTopReplica.WindowSeekers {
|
|||
/// </remarks>
|
||||
public IntPtr OwnerHandle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets whether not visible windows should be skipped.
|
||||
/// </summary>
|
||||
public bool SkipNotVisibleWindows { get; set; }
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
35
OnTopReplica/WindowSeekers/ByClassWindowSeeker.cs
Normal file
35
OnTopReplica/WindowSeekers/ByClassWindowSeeker.cs
Normal file
|
@ -0,0 +1,35 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using OnTopReplica.Native;
|
||||
|
||||
namespace OnTopReplica.WindowSeekers {
|
||||
/// <summary>
|
||||
/// Seeks a single window by matching its window class.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Class matching is exact and case-sensititve.
|
||||
/// </remarks>
|
||||
class ByClassWindowSeeker : BaseWindowSeeker {
|
||||
|
||||
public ByClassWindowSeeker(string className) {
|
||||
if (className == null)
|
||||
throw new ArgumentNullException();
|
||||
|
||||
ClassName = className;
|
||||
}
|
||||
|
||||
public string ClassName { get; private set; }
|
||||
|
||||
protected override bool InspectWindow(IntPtr hwnd, string title, ref bool terminate) {
|
||||
var wndClass = WindowMethods.GetWindowClass(hwnd);
|
||||
|
||||
if (ClassName.Equals(wndClass, StringComparison.CurrentCulture)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -20,15 +20,13 @@ namespace OnTopReplica.WindowSeekers {
|
|||
if (string.IsNullOrEmpty(title))
|
||||
return false;
|
||||
|
||||
if (WindowManagerMethods.IsWindowVisible(hwnd)) {
|
||||
if ((long)WindowManagerMethods.GetParent(hwnd) == 0) {
|
||||
bool hasOwner = (long)WindowManagerMethods.GetWindow(hwnd, WindowManagerMethods.GetWindowMode.GW_OWNER) != 0;
|
||||
WindowMethods.WindowExStyles exStyle = (WindowMethods.WindowExStyles)WindowMethods.GetWindowLong(hwnd, WindowMethods.WindowLong.ExStyle);
|
||||
if ((long)WindowManagerMethods.GetParent(hwnd) == 0) {
|
||||
bool hasOwner = (long)WindowManagerMethods.GetWindow(hwnd, WindowManagerMethods.GetWindowMode.GW_OWNER) != 0;
|
||||
WindowMethods.WindowExStyles exStyle = (WindowMethods.WindowExStyles)WindowMethods.GetWindowLong(hwnd, WindowMethods.WindowLong.ExStyle);
|
||||
|
||||
if (((exStyle & WindowMethods.WindowExStyles.ToolWindow) == 0 && !hasOwner) || //unowned non-tool window
|
||||
((exStyle & WindowMethods.WindowExStyles.AppWindow) == WindowMethods.WindowExStyles.AppWindow && hasOwner)) { //owned application window
|
||||
return true;
|
||||
}
|
||||
if (((exStyle & WindowMethods.WindowExStyles.ToolWindow) == 0 && !hasOwner) || //unowned non-tool window
|
||||
((exStyle & WindowMethods.WindowExStyles.AppWindow) == WindowMethods.WindowExStyles.AppWindow && hasOwner)) { //owned application window
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -31,11 +31,14 @@
|
|||
<setting name="FullscreenAlwaysOnTop" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Setting" serializeAs="String">
|
||||
<value />
|
||||
<setting name="RestoreSizeAndPosition" serializeAs="String">
|
||||
<value>False</value>
|
||||
</setting>
|
||||
<setting name="Setting1" serializeAs="String">
|
||||
<value />
|
||||
<setting name="RestoreLastSize" serializeAs="String">
|
||||
<value>0, 0</value>
|
||||
</setting>
|
||||
<setting name="RestoreLastPosition" serializeAs="String">
|
||||
<value>0, 0</value>
|
||||
</setting>
|
||||
</OnTopReplica.Properties.Settings>
|
||||
</userSettings>
|
||||
|
|
Loading…
Reference in a new issue