From baeadba6386d22b55477ff66665d332227e1250b Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Sun, 31 Aug 2025 20:08:31 +0200 Subject: [PATCH] Try add forms for settings --- DD2Switcher/DD2Switcher.csproj | 6 + DD2Switcher/Form1.Designer.cs | 58 ++++++- DD2Switcher/Form1.cs | 53 ++++++- DD2Switcher/Program.cs | 31 +++- DD2Switcher/SettingsForm.cs | 274 +++++++++++++++++++++++++++++++++ DD2Switcher/app.ico | Bin 0 -> 108076 bytes 6 files changed, 417 insertions(+), 5 deletions(-) create mode 100644 DD2Switcher/SettingsForm.cs create mode 100644 DD2Switcher/app.ico diff --git a/DD2Switcher/DD2Switcher.csproj b/DD2Switcher/DD2Switcher.csproj index 24f1ef7..2d22f56 100644 --- a/DD2Switcher/DD2Switcher.csproj +++ b/DD2Switcher/DD2Switcher.csproj @@ -56,6 +56,9 @@ Form1.cs + + Form + @@ -84,6 +87,9 @@ + + PreserveNewest + \ No newline at end of file diff --git a/DD2Switcher/Form1.Designer.cs b/DD2Switcher/Form1.Designer.cs index e327d81..be3104b 100644 --- a/DD2Switcher/Form1.Designer.cs +++ b/DD2Switcher/Form1.Designer.cs @@ -26,11 +26,67 @@ /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); + this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components); + this.trayMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.settingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.separatorMenuItem = new System.Windows.Forms.ToolStripSeparator(); + this.exitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.trayMenu.SuspendLayout(); + this.SuspendLayout(); + // + // notifyIcon + // + this.notifyIcon.ContextMenuStrip = this.trayMenu; + this.notifyIcon.Text = "DD2Switcher"; + this.notifyIcon.Visible = true; + this.notifyIcon.MouseDoubleClick += + new System.Windows.Forms.MouseEventHandler(this.notifyIcon_MouseDoubleClick); + // + // trayMenu + // + this.trayMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.settingsMenuItem, this.separatorMenuItem, this.exitMenuItem + }); + this.trayMenu.Name = "trayMenu"; + this.trayMenu.Size = new System.Drawing.Size(120, 54); + // + // settingsMenuItem + // + this.settingsMenuItem.Name = "settingsMenuItem"; + this.settingsMenuItem.Size = new System.Drawing.Size(119, 22); + this.settingsMenuItem.Text = "Settings"; + this.settingsMenuItem.Click += new System.EventHandler(this.settingsMenuItem_Click); + // + // separatorMenuItem + // + this.separatorMenuItem.Name = "separatorMenuItem"; + this.separatorMenuItem.Size = new System.Drawing.Size(116, 6); + // + // exitMenuItem + // + this.exitMenuItem.Name = "exitMenuItem"; + this.exitMenuItem.Size = new System.Drawing.Size(119, 22); + this.exitMenuItem.Text = "Exit"; + this.exitMenuItem.Click += new System.EventHandler(this.exitMenuItem_Click); + // + // Form1 + // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "Form1"; + this.Text = "DD2Switcher"; + this.WindowState = System.Windows.Forms.FormWindowState.Minimized; + this.ShowInTaskbar = false; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing); + this.trayMenu.ResumeLayout(false); + this.ResumeLayout(false); } #endregion + + private System.Windows.Forms.NotifyIcon notifyIcon; + private System.Windows.Forms.ContextMenuStrip trayMenu; + private System.Windows.Forms.ToolStripMenuItem settingsMenuItem; + private System.Windows.Forms.ToolStripSeparator separatorMenuItem; + private System.Windows.Forms.ToolStripMenuItem exitMenuItem; } } \ No newline at end of file diff --git a/DD2Switcher/Form1.cs b/DD2Switcher/Form1.cs index 4595d64..eb8d2c3 100644 --- a/DD2Switcher/Form1.cs +++ b/DD2Switcher/Form1.cs @@ -1,9 +1,60 @@ -using System.Windows.Forms; +using System; +using System.Windows.Forms; namespace DD2Switcher { public partial class Form1 : Form { + private SettingsForm settingsForm; + public Form1() { InitializeComponent(); + LoadIcons(); + this.Load += Form1_Load; + } + + private void Form1_Load(object sender, EventArgs e) { + // Hide the form initially since we're running in system tray + this.Hide(); + } + + private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e) { + ShowSettings(); + } + + private void settingsMenuItem_Click(object sender, EventArgs e) { + ShowSettings(); + } + + private void exitMenuItem_Click(object sender, EventArgs e) { + Application.Exit(); + } + + private void Form1_FormClosing(object sender, FormClosingEventArgs e) { + // Prevent the form from closing, just hide it + if (e.CloseReason == CloseReason.UserClosing) { + e.Cancel = true; + this.Hide(); + } + } + + private void ShowSettings() { + if (settingsForm == null || settingsForm.IsDisposed) { + settingsForm = new SettingsForm(); + } + + settingsForm.Show(); + settingsForm.BringToFront(); + } + + private void LoadIcons() { + try { + string iconPath = System.IO.Path.Combine( + System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), + "app.ico"); + this.Icon = new System.Drawing.Icon(iconPath); + this.notifyIcon.Icon = new System.Drawing.Icon(iconPath); + } catch { + // Use default icon if custom icon not found + } } } } \ No newline at end of file diff --git a/DD2Switcher/Program.cs b/DD2Switcher/Program.cs index fe88640..a4ba468 100644 --- a/DD2Switcher/Program.cs +++ b/DD2Switcher/Program.cs @@ -10,6 +10,29 @@ namespace DD2Switcher { internal static class Program { private static int NumProc = 19; private static Process[] windows = new Process[NumProc]; + + // Public access to tracked windows for the settings form + public static Process[] GetTrackedWindows() { + return windows; + } + + public static void UntrackWindow(int index) { + if (index >= 0 && index < NumProc) { + windows[index] = null; + // Compact the array by shifting non-null elements to the left + for (int i = index; i < NumProc - 1; i++) { + windows[i] = windows[i + 1]; + } + windows[NumProc - 1] = null; + + // Update ActiveIndex if needed + if (ActiveIndex == index) { + ActiveIndex = -1; + } else if (ActiveIndex > index) { + ActiveIndex--; + } + } + } private static int ActiveIndex = -1; private static bool AltPressed = false; @@ -246,6 +269,7 @@ namespace DD2Switcher { } private static void TabToPrevious() { + return; try { var foreground = GetForegroundProcess(); if (!ProcessTracked(foreground.Id)) { @@ -288,7 +312,8 @@ namespace DD2Switcher { [STAThread] private static void Main() { - // AllocConsole(); + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); var processes = Process.GetProcesses(); var currentProcess = Process.GetCurrentProcess(); @@ -356,8 +381,8 @@ namespace DD2Switcher { } } - // Console.CancelKeyPress += (sender, e) => { Process.GetCurrentProcess().Kill(); }; - Application.Run(); + // Run the WinForms application with Form1 as the main form + Application.Run(new Form1()); KeyboardHook.Stop(); } } diff --git a/DD2Switcher/SettingsForm.cs b/DD2Switcher/SettingsForm.cs new file mode 100644 index 0000000..b90415b --- /dev/null +++ b/DD2Switcher/SettingsForm.cs @@ -0,0 +1,274 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; + +namespace DD2Switcher { + public partial class SettingsForm : Form { + private Label titleLabel; + private FlowLayoutPanel windowsPanel; + private Label statusLabel; + private Button refreshButton; + private Button closeButton; + private int firstIndex = -1; + private int lastIndex = -1; + + public SettingsForm() { + InitializeComponent(); + LoadIcon(); + RefreshWindowsList(); + } + + private void InitializeComponent() { + this.titleLabel = new Label(); + this.windowsPanel = new FlowLayoutPanel(); + this.statusLabel = new Label(); + this.refreshButton = new Button(); + this.closeButton = new Button(); + this.SuspendLayout(); + // + // titleLabel + // + this.titleLabel.AutoSize = true; + this.titleLabel.Font = new Font("Segoe UI", 14F, FontStyle.Bold); + this.titleLabel.Location = new Point(20, 20); + this.titleLabel.Name = "titleLabel"; + this.titleLabel.Size = new Size(200, 25); + this.titleLabel.Text = "DD2Switcher Settings"; + // + // windowsPanel + // + this.windowsPanel.AutoScroll = true; + this.windowsPanel.BorderStyle = BorderStyle.FixedSingle; + this.windowsPanel.Location = new Point(20, 60); + this.windowsPanel.Name = "windowsPanel"; + this.windowsPanel.Size = new Size(560, 300); + this.windowsPanel.Padding = new Padding(10); + this.windowsPanel.BackColor = Color.White; + // + // statusLabel + // + this.statusLabel.AutoSize = true; + this.statusLabel.Location = new Point(20, 380); + this.statusLabel.Name = "statusLabel"; + this.statusLabel.Size = new Size(400, 15); + this.statusLabel.Text = "DD2Switcher is running in the system tray."; + // + // refreshButton + // + this.refreshButton.Location = new Point(450, 375); + this.refreshButton.Name = "refreshButton"; + this.refreshButton.Size = new Size(75, 23); + this.refreshButton.Text = "Refresh"; + this.refreshButton.Click += new EventHandler(this.refreshButton_Click); + // + // closeButton + // + this.closeButton.Location = new Point(530, 375); + this.closeButton.Name = "closeButton"; + this.closeButton.Size = new Size(75, 23); + this.closeButton.Text = "Close"; + this.closeButton.Click += new EventHandler(this.closeButton_Click); + // + // SettingsForm + // + this.AutoScaleDimensions = new SizeF(6F, 13F); + this.AutoScaleMode = AutoScaleMode.Font; + this.ClientSize = new Size(600, 420); + this.Controls.Add(this.titleLabel); + this.Controls.Add(this.windowsPanel); + this.Controls.Add(this.statusLabel); + this.Controls.Add(this.refreshButton); + this.Controls.Add(this.closeButton); + this.Name = "SettingsForm"; + this.Text = "DD2Switcher Settings"; + this.StartPosition = FormStartPosition.CenterScreen; + this.FormBorderStyle = FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.ResumeLayout(false); + this.PerformLayout(); + } + + private void closeButton_Click(object sender, EventArgs e) { + this.Close(); + } + + private void refreshButton_Click(object sender, EventArgs e) { + RefreshWindowsList(); + } + + private void RefreshWindowsList() { + windowsPanel.Controls.Clear(); + + // Get tracked windows from Program + var trackedWindows = GetTrackedWindows(); + + if (trackedWindows.Count == 0) { + var noWindowsLabel = new Label(); + noWindowsLabel.Text = "No windows currently tracked"; + noWindowsLabel.AutoSize = true; + noWindowsLabel.ForeColor = Color.Gray; + noWindowsLabel.Font = new Font("Segoe UI", 10F); + windowsPanel.Controls.Add(noWindowsLabel); + return; + } + + for (int i = 0; i < trackedWindows.Count; i++) { + var window = trackedWindows[i]; + if (window == null) + continue; + + var windowPanel = CreateWindowPanel(i, window); + windowsPanel.Controls.Add(windowPanel); + } + } + + private Panel CreateWindowPanel(int index, Process window) { + var panel = new Panel(); + panel.Width = 520; + panel.Height = 80; + panel.BorderStyle = BorderStyle.FixedSingle; + panel.Margin = new Padding(5); + panel.BackColor = Color.LightGray; + + // Index label + var indexLabel = new Label(); + indexLabel.Text = $"Index: {index}"; + indexLabel.Location = new Point(10, 5); + indexLabel.AutoSize = true; + indexLabel.Font = new Font("Segoe UI", 9F, FontStyle.Bold); + panel.Controls.Add(indexLabel); + + // Process name + var nameLabel = new Label(); + nameLabel.Text = $"Name: {window.ProcessName}"; + nameLabel.Location = new Point(10, 25); + nameLabel.AutoSize = true; + nameLabel.Font = new Font("Segoe UI", 9F); + panel.Controls.Add(nameLabel); + + // PID + var pidLabel = new Label(); + pidLabel.Text = $"PID: {window.Id}"; + pidLabel.Location = new Point(10, 45); + pidLabel.AutoSize = true; + pidLabel.Font = new Font("Segoe UI", 9F); + panel.Controls.Add(pidLabel); + + // Window title + var titleLabel = new Label(); + titleLabel.Text = $"Title: {window.MainWindowTitle}"; + titleLabel.Location = new Point(200, 25); + titleLabel.AutoSize = true; + titleLabel.Font = new Font("Segoe UI", 9F); + titleLabel.MaximumSize = new Size(200, 0); + panel.Controls.Add(titleLabel); + + // First/Last indicator + var firstLastLabel = new Label(); + firstLastLabel.Text = GetFirstLastText(index); + firstLastLabel.Location = new Point(200, 45); + firstLastLabel.AutoSize = true; + firstLastLabel.Font = new Font("Segoe UI", 9F, FontStyle.Bold); + firstLastLabel.ForeColor = Color.DarkBlue; + panel.Controls.Add(firstLastLabel); + + // Pick button + var pickButton = new Button(); + pickButton.Text = "Pick"; + pickButton.Location = new Point(420, 10); + pickButton.Size = new Size(50, 25); + pickButton.Tag = index; + pickButton.Click += PickButton_Click; + panel.Controls.Add(pickButton); + + // Untrack button + var untrackButton = new Button(); + untrackButton.Text = "Untrack"; + untrackButton.Location = new Point(420, 45); + untrackButton.Size = new Size(50, 25); + untrackButton.Tag = index; + untrackButton.Click += UntrackButton_Click; + panel.Controls.Add(untrackButton); + + return panel; + } + + private string GetFirstLastText(int index) { + if (index == firstIndex && index == lastIndex) { + return "First & Last"; + } else if (index == firstIndex) { + return "First"; + } else if (index == lastIndex) { + return "Last"; + } + return ""; + } + + private void PickButton_Click(object sender, EventArgs e) { + var button = (Button)sender; + int index = (int)button.Tag; + + if (firstIndex == -1) { + // First pick - set both first and last + firstIndex = index; + lastIndex = index; + } else if (lastIndex == -1) { + // Second pick - set last + lastIndex = index; + } else { + // Subsequent picks - determine which becomes first + if (index < firstIndex) { + // New index is lower, so it becomes first + lastIndex = firstIndex; + firstIndex = index; + } else { + // New index is higher, so it becomes last + lastIndex = index; + } + } + + RefreshWindowsList(); + } + + private void UntrackButton_Click(object sender, EventArgs e) { + var button = (Button)sender; + int index = (int)button.Tag; + + // Remove from tracked windows + UntrackWindow(index); + + // Update first/last indices if needed + if (index == firstIndex) { + firstIndex = -1; + } + if (index == lastIndex) { + lastIndex = -1; + } + + RefreshWindowsList(); + } + + private List GetTrackedWindows() { + var windows = Program.GetTrackedWindows(); + return windows.ToList(); + } + + private void UntrackWindow(int index) { + Program.UntrackWindow(index); + } + + private void LoadIcon() { + try { + this.Icon = new Icon(System.IO.Path.Combine( + System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), + "app.ico")); + } catch { + // Use default icon if custom icon not found + } + } + } +} \ No newline at end of file diff --git a/DD2Switcher/app.ico b/DD2Switcher/app.ico new file mode 100644 index 0000000000000000000000000000000000000000..b0e639de7fe5aea6ce6689594eeb7af8764a6c7f GIT binary patch literal 108076 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 literal 0 HcmV?d00001