Widow – Rev 2
?pathlinks?
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Windows;
namespace Widow
{
public partial class RuleEditForm : Form
{
#region Public Enums, Properties and Fields
public Windows.Windows Windows { get; }
public Form1 Form { get; set; }
#endregion
#region Constructors, Destructors and Finalizers
public RuleEditForm(Form1 form1, Windows.Windows windows) : this(windows)
{
Form = form1;
Form.WindowCreated += Form_WindowCreated;
Form.WindowDestroyed += Form_WindowDestroyed;
}
public RuleEditForm(Windows.Windows windows) : this()
{
Windows = windows;
foreach (var window in windows.Window)
{
windowRulesListBox.Items.Add(window);
}
}
private RuleEditForm()
{
InitializeComponent();
desktopWindowsListBox.DisplayMember = "Name";
windowRulesListBox.DisplayMember = "Name";
RefreshWindows();
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && components != null)
{
Form.WindowCreated -= Form_WindowCreated;
Form.WindowDestroyed -= Form_WindowDestroyed;
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
#region Event Handlers
private void Form_WindowDestroyed(object sender, WindowDestroyedEventArgs e)
{
if (string.IsNullOrEmpty(e.Name))
{
return;
}
var indices = new List<int>();
for (var i = 0; i < desktopWindowsListBox.Items.Count; ++i)
{
if (((Window) desktopWindowsListBox.Items[i]).Name == e.Name)
{
indices.Add(i);
}
}
foreach (var index in indices)
{
desktopWindowsListBox.Items.RemoveAt(index);
}
}
private void Form_WindowCreated(object sender, WindowCreatedEventArgs e)
{
if (string.IsNullOrEmpty(e.Name))
{
return;
}
var found = false;
foreach (var window in desktopWindowsListBox.Items)
{
if (((Window) window).Name == e.Name)
{
found = true;
break;
}
}
if (found)
{
return;
}
if (Natives.GetWindowRect(e.Handle, out var rect))
{
var window = new Window(e.Name, rect.Top, rect.Left, rect.Right - rect.Left,
rect.Bottom - rect.Top);
desktopWindowsListBox.Items.Add(window);
}
}
private void WindowRulesListBox_SelectedIndexChanged(object sender, EventArgs e)
{
var listBox = (ListBox) sender;
if (listBox.SelectedIndex == -1)
{
WindowName.Text = string.Empty;
WindowLeft.Text = string.Empty;
WindowTop.Text = string.Empty;
WindowWidth.Text = string.Empty;
WindowHeight.Text = string.Empty;
return;
}
var window = (Window) listBox.SelectedItem;
if (window == null)
{
return;
}
WindowName.Text = window.Name;
WindowLeft.Text = window.Left.ToString();
WindowTop.Text = window.Top.ToString();
WindowWidth.Text = window.Width.ToString();
WindowHeight.Text = window.Height.ToString();
}
private void RefreshButton_Click(object sender, EventArgs e)
{
RefreshWindows();
}
private void RemoveButton_Click(object sender, EventArgs e)
{
var window = (Window) windowRulesListBox.SelectedItem;
if (window == null)
{
return;
}
var index = -1;
for (var i = 0; i < windowRulesListBox.Items.Count; ++i)
{
if (((Window) windowRulesListBox.Items[i]).Name == window.Name)
{
index = i;
break;
}
}
if (index == -1)
{
return;
}
windowRulesListBox.Items.RemoveAt(index);
Windows.Window.Remove(window);
}
private void AddButton_Click(object sender, EventArgs e)
{
var window = (Window) desktopWindowsListBox.SelectedItem;
if (window == null)
{
return;
}
var found = false;
foreach (var windowRule in windowRulesListBox.Items)
{
if (((Window) windowRule).Name == window.Name)
{
found = true;
break;
}
}
if (found)
{
return;
}
windowRulesListBox.Items.Add(window);
Windows.Window.Add(window);
}
private void OnWindowSettings_TextChanged(object sender, EventArgs e)
{
var selectedWindow = (Window) windowRulesListBox.SelectedItem;
if (selectedWindow == null)
{
WindowName.Text = string.Empty;
WindowLeft.Text = string.Empty;
WindowTop.Text = string.Empty;
WindowWidth.Text = string.Empty;
WindowHeight.Text = string.Empty;
return;
}
var textBox = (TextBox) sender;
switch (textBox.Name)
{
case nameof(WindowName):
selectedWindow.Name = textBox.Text;
break;
case nameof(WindowLeft):
if (int.TryParse(textBox.Text, out var left))
{
selectedWindow.Left = left;
}
break;
case nameof(WindowTop):
if (int.TryParse(textBox.Text, out var top))
{
selectedWindow.Top = top;
}
break;
case nameof(WindowWidth):
if (int.TryParse(textBox.Text, out var width))
{
selectedWindow.Width = width;
}
break;
case nameof(WindowHeight):
if (int.TryParse(textBox.Text, out var height))
{
selectedWindow.Height = height;
}
break;
}
}
#endregion
#region Private Methods
private void RefreshWindows()
{
foreach (var desktopWindow in Helpers.GetDesktopWindows())
{
if (string.IsNullOrEmpty(desktopWindow.Title))
{
continue;
}
if (Natives.GetWindowRect(desktopWindow.Handle, out var rect))
{
var window = new Window(desktopWindow.Title, rect.Top, rect.Left, rect.Right - rect.Left,
rect.Bottom - rect.Top);
var found = false;
foreach (var item in desktopWindowsListBox.Items)
{
if (((Window) item).Name == window.Name)
{
found = true;
break;
}
}
if (!found)
{
desktopWindowsListBox.Items.Add(window);
}
}
}
}
#endregion
}
}
Generated by GNU Enscript 1.6.5.90.