Compare commits
27 Commits
b5446516e4
...
master
Author | SHA1 | Date | |
---|---|---|---|
15bee9bf62 | |||
32758cf062 | |||
f4524161ac | |||
12ac48aa76 | |||
62f92708c2 | |||
88005c2125 | |||
df936e187d | |||
833355cd60 | |||
0b7aaa2f99 | |||
274a75b93d | |||
3b038b0fc9 | |||
69fd02e331 | |||
87bd2132e5 | |||
1cdfba0b14 | |||
0e3f2005d1 | |||
c4e9007f2b | |||
1f314d5c4b | |||
f234279135 | |||
baeadba638 | |||
bad2313c18 | |||
458a466c15 | |||
5e95937ae9 | |||
48d3af7c94 | |||
603bc488e8 | |||
cf804a6c8b | |||
9de3ae43d5 | |||
886258e4c3 |
3
.clang-format
Normal file
3
.clang-format
Normal file
@@ -0,0 +1,3 @@
|
||||
BasedOnStyle: Google
|
||||
IndentWidth: 4
|
||||
ColumnLimit: 120
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,4 +1,5 @@
|
||||
.idea
|
||||
obj
|
||||
bin
|
||||
.vs
|
||||
.vs
|
||||
packages
|
||||
|
@@ -1,6 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
|
||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
|
||||
</startup>
|
||||
</configuration>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
|
@@ -1,87 +1,139 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')"/>
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{2AC26899-8E27-4B96-85A9-C387186EAD27}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RootNamespace>DD2Switcher</RootNamespace>
|
||||
<AssemblyName>DD2Switcher</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.8.1</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
<Deterministic>true</Deterministic>
|
||||
<LangVersion>9.0</LangVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32bit>false</Prefer32bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32bit>false</Prefer32bit>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System"/>
|
||||
<Reference Include="System.Core"/>
|
||||
<Reference Include="System.Xml.Linq"/>
|
||||
<Reference Include="System.Data.DataSetExtensions"/>
|
||||
<Reference Include="Microsoft.CSharp"/>
|
||||
<Reference Include="System.Data"/>
|
||||
<Reference Include="System.Deployment"/>
|
||||
<Reference Include="System.Drawing"/>
|
||||
<Reference Include="System.Net.Http"/>
|
||||
<Reference Include="System.Windows.Forms"/>
|
||||
<Reference Include="System.Xml"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Form1.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Form1.Designer.cs">
|
||||
<DependentUpon>Form1.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="HotKeyManager.cs"/>
|
||||
<Compile Include="Program.cs"/>
|
||||
<Compile Include="Properties\AssemblyInfo.cs"/>
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="beep.wav"/>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets"/>
|
||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{2AC26899-8E27-4B96-85A9-C387186EAD27}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
<RootNamespace>DD2Switcher</RootNamespace>
|
||||
<AssemblyName>DD2Switcher</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||
<Deterministic>true</Deterministic>
|
||||
<LangVersion>9.0</LangVersion>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32bit>false</Prefer32bit>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<Prefer32bit>false</Prefer32bit>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=9.0.0.8, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.8\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Core" />
|
||||
<Reference Include="System.IO.Pipelines, Version=9.0.0.8, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.IO.Pipelines.9.0.8\lib\net462\System.IO.Pipelines.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Numerics" />
|
||||
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Text.Encodings.Web, Version=9.0.0.8, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Text.Encodings.Web.9.0.8\lib\net462\System.Text.Encodings.Web.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Text.Json, Version=9.0.0.8, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Text.Json.9.0.8\lib\net462\System.Text.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Xml.Linq" />
|
||||
<Reference Include="System.Data.DataSetExtensions" />
|
||||
<Reference Include="Microsoft.CSharp" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Form1.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Form1.Designer.cs">
|
||||
<DependentUpon>Form1.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="SettingsForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="WindowPanelForm.cs">
|
||||
<SubType>UserControl</SubType>
|
||||
</Compile>
|
||||
<Compile Include="WindowPanelForm.Designer.cs">
|
||||
<DependentUpon>WindowPanelForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="HotKeyManager.cs" />
|
||||
<Compile Include="KeyboardHook.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<EmbeddedResource Include="Properties\Resources.resx">
|
||||
<Generator>ResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
<Compile Include="Properties\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<EmbeddedResource Include="SettingsForm.resx">
|
||||
<DependentUpon>SettingsForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="WindowPanelForm.resx">
|
||||
<DependentUpon>WindowPanelForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<None Include="packages.config" />
|
||||
<None Include="Properties\Settings.settings">
|
||||
<Generator>SettingsSingleFileGenerator</Generator>
|
||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
||||
</None>
|
||||
<Compile Include="Properties\Settings.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DependentUpon>Settings.settings</DependentUpon>
|
||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="beep.wav" />
|
||||
<Content Include="app.ico">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
</Project>
|
110
DD2Switcher/Form1.Designer.cs
generated
110
DD2Switcher/Form1.Designer.cs
generated
@@ -1,36 +1,92 @@
|
||||
namespace DD2Switcher {
|
||||
partial class Form1 {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
partial class Form1 {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <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)) {
|
||||
components.Dispose();
|
||||
}
|
||||
/// <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)) {
|
||||
components.Dispose();
|
||||
}
|
||||
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.components = new System.ComponentModel.Container();
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(800, 450);
|
||||
this.Text = "Form1";
|
||||
}
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
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 = "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;
|
||||
}
|
||||
}
|
@@ -1,7 +1,60 @@
|
||||
using System.Windows.Forms;
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DD2Switcher {
|
||||
public partial class Form1 : Form {
|
||||
public Form1() { InitializeComponent(); }
|
||||
}
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -4,109 +4,97 @@ using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DD2Switcher {
|
||||
public static class HotKeyManager {
|
||||
private static volatile MessageWindow _wnd;
|
||||
private static volatile IntPtr _hwnd;
|
||||
private static readonly ManualResetEvent _windowReadyEvent = new(false);
|
||||
public static class HotKeyManager {
|
||||
private static volatile MessageWindow _wnd;
|
||||
private static volatile IntPtr _hwnd;
|
||||
private static readonly ManualResetEvent _windowReadyEvent = new(false);
|
||||
|
||||
private static int _id;
|
||||
private static int _id;
|
||||
|
||||
static HotKeyManager() {
|
||||
var messageLoop =
|
||||
new Thread(delegate() { Application.Run(new MessageWindow()); });
|
||||
messageLoop.Name = "MessageLoopThread";
|
||||
messageLoop.IsBackground = true;
|
||||
messageLoop.Start();
|
||||
}
|
||||
static HotKeyManager() {
|
||||
var messageLoop = new Thread(delegate() { Application.Run(new MessageWindow()); });
|
||||
messageLoop.Name = "MessageLoopThread";
|
||||
messageLoop.IsBackground = true;
|
||||
messageLoop.Start();
|
||||
}
|
||||
|
||||
public static event EventHandler<HotKeyEventArgs> HotKeyPressed;
|
||||
public static event EventHandler<HotKeyEventArgs> HotKeyPressed;
|
||||
|
||||
public static int RegisterHotKey(Keys key, KeyModifiers modifiers) {
|
||||
_windowReadyEvent.WaitOne();
|
||||
var id = Interlocked.Increment(ref _id);
|
||||
_wnd.Invoke(new RegisterHotKeyDelegate(RegisterHotKeyInternal), _hwnd, id,
|
||||
(uint)modifiers, (uint)key);
|
||||
return id;
|
||||
}
|
||||
public static int RegisterHotKey(Keys key, KeyModifiers modifiers) {
|
||||
_windowReadyEvent.WaitOne();
|
||||
var id = Interlocked.Increment(ref _id);
|
||||
_wnd.Invoke(new RegisterHotKeyDelegate(RegisterHotKeyInternal), _hwnd, id, (uint)modifiers, (uint)key);
|
||||
return id;
|
||||
}
|
||||
|
||||
public static void UnregisterHotKey(int id) {
|
||||
_wnd.Invoke(new UnRegisterHotKeyDelegate(UnRegisterHotKeyInternal), _hwnd,
|
||||
id);
|
||||
}
|
||||
public static void UnregisterHotKey(int id) {
|
||||
_wnd.Invoke(new UnRegisterHotKeyDelegate(UnRegisterHotKeyInternal), _hwnd, id);
|
||||
}
|
||||
|
||||
private static void RegisterHotKeyInternal(IntPtr hwnd, int id,
|
||||
uint modifiers, uint key) {
|
||||
RegisterHotKey(hwnd, id, modifiers, key);
|
||||
}
|
||||
private static void RegisterHotKeyInternal(IntPtr hwnd, int id, uint modifiers, uint key) {
|
||||
RegisterHotKey(hwnd, id, modifiers, key);
|
||||
}
|
||||
|
||||
private static void UnRegisterHotKeyInternal(IntPtr hwnd, int id) {
|
||||
UnregisterHotKey(_hwnd, id);
|
||||
}
|
||||
private static void UnRegisterHotKeyInternal(IntPtr hwnd, int id) {
|
||||
UnregisterHotKey(_hwnd, id);
|
||||
}
|
||||
|
||||
private static void OnHotKeyPressed(HotKeyEventArgs e) {
|
||||
if (HotKeyPressed != null)
|
||||
HotKeyPressed(null, e);
|
||||
}
|
||||
private static void OnHotKeyPressed(HotKeyEventArgs e) {
|
||||
if (HotKeyPressed != null)
|
||||
HotKeyPressed(null, e);
|
||||
}
|
||||
|
||||
[DllImport("user32", SetLastError = true)]
|
||||
private static extern bool RegisterHotKey(IntPtr hWnd, int id,
|
||||
uint fsModifiers, uint vk);
|
||||
[DllImport("user32", SetLastError = true)]
|
||||
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
|
||||
|
||||
[DllImport("user32", SetLastError = true)]
|
||||
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
|
||||
[DllImport("user32", SetLastError = true)]
|
||||
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
|
||||
|
||||
private delegate void RegisterHotKeyDelegate(IntPtr hwnd, int id,
|
||||
uint modifiers, uint key);
|
||||
private delegate void RegisterHotKeyDelegate(IntPtr hwnd, int id, uint modifiers, uint key);
|
||||
|
||||
private delegate void UnRegisterHotKeyDelegate(IntPtr hwnd, int id);
|
||||
private delegate void UnRegisterHotKeyDelegate(IntPtr hwnd, int id);
|
||||
|
||||
private class MessageWindow : Form {
|
||||
private const int WM_HOTKEY = 0x312;
|
||||
private class MessageWindow : Form {
|
||||
private const int WM_HOTKEY = 0x312;
|
||||
|
||||
public MessageWindow() {
|
||||
_wnd = this;
|
||||
_hwnd = Handle;
|
||||
_windowReadyEvent.Set();
|
||||
public MessageWindow() {
|
||||
_wnd = this;
|
||||
_hwnd = Handle;
|
||||
_windowReadyEvent.Set();
|
||||
}
|
||||
|
||||
protected override void WndProc(ref Message m) {
|
||||
if (m.Msg == WM_HOTKEY) {
|
||||
var e = new HotKeyEventArgs(m.LParam);
|
||||
OnHotKeyPressed(e);
|
||||
}
|
||||
|
||||
base.WndProc(ref m);
|
||||
}
|
||||
|
||||
protected override void SetVisibleCore(bool value) {
|
||||
// Ensure the window never becomes visible
|
||||
base.SetVisibleCore(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void WndProc(ref Message m) {
|
||||
if (m.Msg == WM_HOTKEY) {
|
||||
var e = new HotKeyEventArgs(m.LParam);
|
||||
OnHotKeyPressed(e);
|
||||
}
|
||||
public class HotKeyEventArgs : EventArgs {
|
||||
public readonly Keys Key;
|
||||
public readonly KeyModifiers Modifiers;
|
||||
|
||||
base.WndProc(ref m);
|
||||
public HotKeyEventArgs(Keys key, KeyModifiers modifiers) {
|
||||
Key = key;
|
||||
Modifiers = modifiers;
|
||||
}
|
||||
|
||||
public HotKeyEventArgs(IntPtr hotKeyParam) {
|
||||
var param = (uint)hotKeyParam.ToInt64();
|
||||
Key = (Keys)((param & 0xffff0000) >> 16);
|
||||
Modifiers = (KeyModifiers)(param & 0x0000ffff);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void SetVisibleCore(bool value) {
|
||||
// Ensure the window never becomes visible
|
||||
base.SetVisibleCore(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class HotKeyEventArgs : EventArgs {
|
||||
public readonly Keys Key;
|
||||
public readonly KeyModifiers Modifiers;
|
||||
|
||||
public HotKeyEventArgs(Keys key, KeyModifiers modifiers) {
|
||||
Key = key;
|
||||
Modifiers = modifiers;
|
||||
}
|
||||
|
||||
public HotKeyEventArgs(IntPtr hotKeyParam) {
|
||||
var param = (uint)hotKeyParam.ToInt64();
|
||||
Key = (Keys)((param & 0xffff0000) >> 16);
|
||||
Modifiers = (KeyModifiers)(param & 0x0000ffff);
|
||||
}
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum KeyModifiers {
|
||||
Alt = 1,
|
||||
Control = 2,
|
||||
Shift = 4,
|
||||
Windows = 8,
|
||||
NoRepeat = 0x4000
|
||||
}
|
||||
[Flags]
|
||||
public enum KeyModifiers { Alt = 1, Control = 2, Shift = 4, Windows = 8, NoRepeat = 0x4000 }
|
||||
}
|
66
DD2Switcher/KeyboardHook.cs
Normal file
66
DD2Switcher/KeyboardHook.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows.Forms;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
class KeyboardHook {
|
||||
private const int WH_KEYBOARD_LL = 13;
|
||||
private const int WM_KEYDOWN = 0x0104;
|
||||
private const int WM_KEYUP = 0x0101;
|
||||
private static LowLevelKeyboardProc _proc = HookCallback;
|
||||
private static IntPtr _hookID = IntPtr.Zero;
|
||||
|
||||
public static int previousEvent = 0;
|
||||
public static event EventHandler<int> KeyDown;
|
||||
public static event EventHandler<int> KeyUp;
|
||||
|
||||
public static void Start() {
|
||||
_hookID = SetHook(_proc);
|
||||
}
|
||||
|
||||
public static void Stop() {
|
||||
UnhookWindowsHookEx(_hookID);
|
||||
}
|
||||
|
||||
private static IntPtr SetHook(LowLevelKeyboardProc proc) {
|
||||
using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule =
|
||||
curProcess.MainModule) {
|
||||
return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
|
||||
}
|
||||
}
|
||||
|
||||
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
|
||||
if (nCode >= 0) {
|
||||
int vkCode = Marshal.ReadInt32(lParam);
|
||||
int pero = (int)wParam * 1000 + vkCode;
|
||||
if (pero != previousEvent) {
|
||||
if (wParam == (IntPtr)WM_KEYDOWN) {
|
||||
Console.WriteLine($"KeyboardHook: KeyDown event for key {vkCode}");
|
||||
KeyDown?.Invoke(null, vkCode);
|
||||
} else if (wParam == (IntPtr)WM_KEYUP) {
|
||||
Console.WriteLine($"KeyboardHook: KeyUp event for key {vkCode}");
|
||||
KeyUp?.Invoke(null, vkCode);
|
||||
}
|
||||
previousEvent = pero;
|
||||
} else {
|
||||
Console.WriteLine($"KeyboardHook: Same event filtered out - vkCode: {vkCode}, wParam: {wParam}");
|
||||
}
|
||||
}
|
||||
return CallNextHookEx(_hookID, nCode, wParam, lParam);
|
||||
}
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
[return:MarshalAs(UnmanagedType.Bool)]
|
||||
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
|
||||
|
||||
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
|
||||
private static extern IntPtr GetModuleHandle(string lpModuleName);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
88
DD2Switcher/Properties/Resources.Designer.cs
generated
88
DD2Switcher/Properties/Resources.Designer.cs
generated
@@ -9,55 +9,53 @@
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace DD2Switcher.Properties {
|
||||
using System;
|
||||
using System;
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(
|
||||
"System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder",
|
||||
"17.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
internal class Resources {
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance",
|
||||
"CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {}
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(
|
||||
"Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {}
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(
|
||||
global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(
|
||||
"DD2Switcher.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(
|
||||
global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp =
|
||||
new global::System.Resources.ResourceManager(
|
||||
"DD2Switcher.Properties.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(
|
||||
global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get { return resourceCulture; }
|
||||
set { resourceCulture = value; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(
|
||||
global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
internal static global::System.Globalization.CultureInfo Culture {
|
||||
get { return resourceCulture; }
|
||||
set { resourceCulture = value; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
24
DD2Switcher/Properties/Settings.Designer.cs
generated
24
DD2Switcher/Properties/Settings.Designer.cs
generated
@@ -9,18 +9,16 @@
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace DD2Switcher.Properties {
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(
|
||||
"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator",
|
||||
"11.0.0.0")]
|
||||
internal sealed partial class Settings
|
||||
: global::System.Configuration.ApplicationSettingsBase {
|
||||
private static Settings defaultInstance =
|
||||
((Settings)(global::System.Configuration.ApplicationSettingsBase
|
||||
.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default {
|
||||
get { return defaultInstance; }
|
||||
}
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(
|
||||
"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.14.0.0")]
|
||||
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
|
||||
private static Settings defaultInstance =
|
||||
((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
|
||||
|
||||
public static Settings Default {
|
||||
get { return defaultInstance; }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
316
DD2Switcher/SettingsForm.cs
Normal file
316
DD2Switcher/SettingsForm.cs
Normal file
@@ -0,0 +1,316 @@
|
||||
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 TabControl tabControl;
|
||||
private TabPage windowsTab;
|
||||
private TabPage sequenceTab;
|
||||
private FlowLayoutPanel windowsPanel;
|
||||
private Label sequenceKeybindLabel;
|
||||
private TextBox sequenceKeybindTextBox;
|
||||
private Label sequenceTimerDelayLabel;
|
||||
private NumericUpDown sequenceTimerDelayNumericUpDown;
|
||||
|
||||
public SettingsForm() {
|
||||
InitializeComponent();
|
||||
LoadIcon();
|
||||
RefreshWindowsList();
|
||||
}
|
||||
|
||||
private void InitializeComponent() {
|
||||
this.tabControl = new System.Windows.Forms.TabControl();
|
||||
this.windowsTab = new System.Windows.Forms.TabPage();
|
||||
this.windowsPanel = new System.Windows.Forms.FlowLayoutPanel();
|
||||
this.sequenceTab = new System.Windows.Forms.TabPage();
|
||||
this.sequenceKeybindTextBox = new System.Windows.Forms.TextBox();
|
||||
this.sequenceKeybindLabel = new System.Windows.Forms.Label();
|
||||
this.sequenceTimerDelayNumericUpDown = new System.Windows.Forms.NumericUpDown();
|
||||
this.sequenceTimerDelayLabel = new System.Windows.Forms.Label();
|
||||
this.tabControl.SuspendLayout();
|
||||
this.windowsTab.SuspendLayout();
|
||||
this.sequenceTab.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.sequenceTimerDelayNumericUpDown)).BeginInit();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// tabControl
|
||||
//
|
||||
this.tabControl.Controls.Add(this.windowsTab);
|
||||
this.tabControl.Controls.Add(this.sequenceTab);
|
||||
this.tabControl.Location = new System.Drawing.Point(12, 12);
|
||||
this.tabControl.Name = "tabControl";
|
||||
this.tabControl.SelectedIndex = 0;
|
||||
this.tabControl.Size = new System.Drawing.Size(576, 396);
|
||||
this.tabControl.TabIndex = 0;
|
||||
//
|
||||
// windowsTab
|
||||
//
|
||||
this.windowsTab.Controls.Add(this.windowsPanel);
|
||||
this.windowsTab.Location = new System.Drawing.Point(4, 22);
|
||||
this.windowsTab.Name = "windowsTab";
|
||||
this.windowsTab.Padding = new System.Windows.Forms.Padding(3);
|
||||
this.windowsTab.Size = new System.Drawing.Size(568, 370);
|
||||
this.windowsTab.TabIndex = 0;
|
||||
this.windowsTab.Text = "Windows";
|
||||
this.windowsTab.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// windowsPanel
|
||||
//
|
||||
this.windowsPanel.AutoScroll = true;
|
||||
this.windowsPanel.BackColor = System.Drawing.Color.White;
|
||||
this.windowsPanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
|
||||
this.windowsPanel.Location = new System.Drawing.Point(6, 6);
|
||||
this.windowsPanel.Name = "windowsPanel";
|
||||
this.windowsPanel.Padding = new System.Windows.Forms.Padding(10);
|
||||
this.windowsPanel.Size = new System.Drawing.Size(556, 358);
|
||||
this.windowsPanel.TabIndex = 0;
|
||||
//
|
||||
// sequenceTab
|
||||
//
|
||||
this.sequenceTab.Controls.Add(this.sequenceTimerDelayNumericUpDown);
|
||||
this.sequenceTab.Controls.Add(this.sequenceTimerDelayLabel);
|
||||
this.sequenceTab.Controls.Add(this.sequenceKeybindTextBox);
|
||||
this.sequenceTab.Controls.Add(this.sequenceKeybindLabel);
|
||||
this.sequenceTab.Location = new System.Drawing.Point(4, 22);
|
||||
this.sequenceTab.Name = "sequenceTab";
|
||||
this.sequenceTab.Padding = new System.Windows.Forms.Padding(3);
|
||||
this.sequenceTab.Size = new System.Drawing.Size(568, 370);
|
||||
this.sequenceTab.TabIndex = 1;
|
||||
this.sequenceTab.Text = "Sequence";
|
||||
this.sequenceTab.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// sequenceKeybindTextBox
|
||||
//
|
||||
this.sequenceKeybindTextBox.Location = new System.Drawing.Point(126, 17);
|
||||
this.sequenceKeybindTextBox.Name = "sequenceKeybindTextBox";
|
||||
this.sequenceKeybindTextBox.Size = new System.Drawing.Size(111, 20);
|
||||
this.sequenceKeybindTextBox.TabIndex = 1;
|
||||
this.sequenceKeybindTextBox.Text = Program.SequenceKeybind.ToString();
|
||||
this.sequenceKeybindTextBox.Leave += new System.EventHandler(this.sequenceKeybindTextBox_Leave);
|
||||
//
|
||||
// sequenceKeybindLabel
|
||||
//
|
||||
this.sequenceKeybindLabel.AutoSize = true;
|
||||
this.sequenceKeybindLabel.Location = new System.Drawing.Point(20, 20);
|
||||
this.sequenceKeybindLabel.Name = "sequenceKeybindLabel";
|
||||
this.sequenceKeybindLabel.Size = new System.Drawing.Size(100, 13);
|
||||
this.sequenceKeybindLabel.TabIndex = 0;
|
||||
this.sequenceKeybindLabel.Text = "Sequence Keybind:";
|
||||
//
|
||||
// sequenceTimerDelayLabel
|
||||
//
|
||||
this.sequenceTimerDelayLabel.AutoSize = true;
|
||||
this.sequenceTimerDelayLabel.Location = new System.Drawing.Point(20, 50);
|
||||
this.sequenceTimerDelayLabel.Name = "sequenceTimerDelayLabel";
|
||||
this.sequenceTimerDelayLabel.Size = new System.Drawing.Size(100, 13);
|
||||
this.sequenceTimerDelayLabel.TabIndex = 2;
|
||||
this.sequenceTimerDelayLabel.Text = "Timer Delay (ms):";
|
||||
//
|
||||
// sequenceTimerDelayNumericUpDown
|
||||
//
|
||||
this.sequenceTimerDelayNumericUpDown.Location = new System.Drawing.Point(126, 47);
|
||||
this.sequenceTimerDelayNumericUpDown.Name = "sequenceTimerDelayNumericUpDown";
|
||||
this.sequenceTimerDelayNumericUpDown.Size = new System.Drawing.Size(111, 20);
|
||||
this.sequenceTimerDelayNumericUpDown.TabIndex = 3;
|
||||
this.sequenceTimerDelayNumericUpDown.Minimum = 10;
|
||||
this.sequenceTimerDelayNumericUpDown.Maximum = 10000;
|
||||
this.sequenceTimerDelayNumericUpDown.Value = Program.SequenceTimerDelay;
|
||||
this.sequenceTimerDelayNumericUpDown.ValueChanged +=
|
||||
new System.EventHandler(this.sequenceTimerDelayNumericUpDown_ValueChanged);
|
||||
//
|
||||
// SettingsForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(600, 420);
|
||||
this.Controls.Add(this.tabControl);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||
this.MaximizeBox = false;
|
||||
this.MinimizeBox = false;
|
||||
this.Name = "SettingsForm";
|
||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
||||
this.Text = "DD2Switcher Settings";
|
||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.SettingsForm_FormClosing);
|
||||
this.tabControl.ResumeLayout(false);
|
||||
this.windowsTab.ResumeLayout(false);
|
||||
this.sequenceTab.ResumeLayout(false);
|
||||
this.sequenceTab.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.sequenceTimerDelayNumericUpDown)).EndInit();
|
||||
this.ResumeLayout(false);
|
||||
}
|
||||
|
||||
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 windowPanelForm = new WindowPanelForm();
|
||||
windowPanelForm.WindowIndex = i;
|
||||
windowPanelForm.WindowProcess = window;
|
||||
windowPanelForm.IsFirst = (i == Program.FirstIndex);
|
||||
windowPanelForm.IsLast = (i == Program.LastIndex);
|
||||
windowPanelForm.UpdateDisplay();
|
||||
|
||||
windowPanelForm.PickClicked += (sender, index) => {
|
||||
// If clicking on a window that's already first or last, remove that setting
|
||||
if (index == Program.FirstIndex) {
|
||||
Program.FirstIndex = -1;
|
||||
Console.WriteLine($"Removed first index: {index}");
|
||||
} else if (index == Program.LastIndex) {
|
||||
Program.LastIndex = -1;
|
||||
Console.WriteLine($"Removed last index: {index}");
|
||||
} else if (Program.FirstIndex == -1) {
|
||||
// First pick - set both first and last
|
||||
Program.FirstIndex = index;
|
||||
Program.LastIndex = index;
|
||||
Console.WriteLine($"Set first and last index: {index}");
|
||||
} else if (Program.LastIndex == -1) {
|
||||
// Second pick - set last (must be >= first)
|
||||
if (index >= Program.FirstIndex) {
|
||||
Program.LastIndex = index;
|
||||
} else {
|
||||
Program.LastIndex = Program.FirstIndex;
|
||||
Program.FirstIndex = index;
|
||||
}
|
||||
Console.WriteLine($"Set last index: {Program.LastIndex}");
|
||||
} else {
|
||||
// Subsequent picks - determine which becomes first
|
||||
int distanceToFirst = Math.Abs(index - Program.FirstIndex);
|
||||
int distanceToLast = Math.Abs(index - Program.LastIndex);
|
||||
|
||||
if (distanceToFirst <= distanceToLast) {
|
||||
// New index is closer to first, so first moves
|
||||
if (index <= Program.LastIndex) {
|
||||
Program.FirstIndex = index;
|
||||
} else {
|
||||
Program.LastIndex = Program.FirstIndex;
|
||||
Program.FirstIndex = index;
|
||||
}
|
||||
} else {
|
||||
// New index is closer to last, so last moves
|
||||
if (index >= Program.FirstIndex) {
|
||||
Program.LastIndex = index;
|
||||
} else {
|
||||
Program.FirstIndex = Program.LastIndex;
|
||||
Program.LastIndex = index;
|
||||
}
|
||||
}
|
||||
Console.WriteLine($"Updated indices: First={Program.FirstIndex}, Last={Program.LastIndex}");
|
||||
}
|
||||
|
||||
// Ensure last >= first
|
||||
if (Program.LastIndex < Program.FirstIndex) {
|
||||
int tmp = Program.LastIndex;
|
||||
Program.LastIndex = Program.FirstIndex;
|
||||
Program.FirstIndex = tmp;
|
||||
}
|
||||
|
||||
RefreshWindowsList();
|
||||
};
|
||||
windowPanelForm.UntrackClicked += (sender, index) => {
|
||||
UntrackWindow(index);
|
||||
RefreshWindowsList();
|
||||
};
|
||||
|
||||
windowsPanel.Controls.Add(windowPanelForm);
|
||||
}
|
||||
}
|
||||
|
||||
private string GetFirstLastText(int index) {
|
||||
if (index == Program.FirstIndex && index == Program.LastIndex) {
|
||||
return "First & Last";
|
||||
} else if (index == Program.FirstIndex) {
|
||||
return "First";
|
||||
} else if (index == Program.LastIndex) {
|
||||
return "Last";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
private List<Process> 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
|
||||
}
|
||||
}
|
||||
|
||||
private void sequenceKeybindTextBox_Leave(object sender, EventArgs e) {
|
||||
Console.WriteLine($"sequenceKeybindTextBox_Leave called with text: {sequenceKeybindTextBox.Text}");
|
||||
try {
|
||||
KeysConverter converter = new KeysConverter();
|
||||
Keys newKey = (Keys)converter.ConvertFromString(sequenceKeybindTextBox.Text);
|
||||
Console.WriteLine($"Converted key: {newKey} (code: {(int)newKey})");
|
||||
Program.UpdateSequenceHotkey(newKey);
|
||||
Console.WriteLine("Keybind updated successfully!");
|
||||
} catch (Exception ex) {
|
||||
Console.WriteLine($"Error converting key: {ex.Message}");
|
||||
sequenceKeybindTextBox.Text = Program.SequenceKeybind.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
private void sequenceTimerDelayNumericUpDown_ValueChanged(object sender, EventArgs e) {
|
||||
Console.WriteLine(
|
||||
$"sequenceTimerDelayNumericUpDown_ValueChanged called with value: {sequenceTimerDelayNumericUpDown.Value}");
|
||||
try {
|
||||
int newDelay = (int)sequenceTimerDelayNumericUpDown.Value;
|
||||
Program.SequenceTimerDelay = newDelay;
|
||||
Program.SaveSettings();
|
||||
Console.WriteLine($"Timer delay updated to: {newDelay}ms");
|
||||
} catch (Exception ex) {
|
||||
Console.WriteLine($"Error updating timer delay: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void SettingsForm_FormClosing(object sender, FormClosingEventArgs e) {
|
||||
Console.WriteLine("SettingsForm closing - saving keybind");
|
||||
try {
|
||||
KeysConverter converter = new KeysConverter();
|
||||
Keys newKey = (Keys)converter.ConvertFromString(sequenceKeybindTextBox.Text);
|
||||
Console.WriteLine($"Saving keybind on close: {newKey}");
|
||||
Program.UpdateSequenceHotkey(newKey);
|
||||
} catch (Exception ex) {
|
||||
Console.WriteLine($"Error saving keybind on close: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
120
DD2Switcher/SettingsForm.resx
Normal file
120
DD2Switcher/SettingsForm.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
133
DD2Switcher/WindowPanelForm.Designer.cs
generated
Normal file
133
DD2Switcher/WindowPanelForm.Designer.cs
generated
Normal file
@@ -0,0 +1,133 @@
|
||||
namespace DD2Switcher {
|
||||
partial class WindowPanelForm {
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <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)) {
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent() {
|
||||
this.indexLabel = new System.Windows.Forms.Label();
|
||||
this.nameLabel = new System.Windows.Forms.Label();
|
||||
this.pidLabel = new System.Windows.Forms.Label();
|
||||
this.titleLabel = new System.Windows.Forms.Label();
|
||||
this.firstLastLabel = new System.Windows.Forms.Label();
|
||||
this.pickButton = new System.Windows.Forms.Button();
|
||||
this.untrackButton = new System.Windows.Forms.Button();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// indexLabel
|
||||
//
|
||||
this.indexLabel.AutoSize = true;
|
||||
this.indexLabel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold);
|
||||
this.indexLabel.Location = new System.Drawing.Point(10, 5);
|
||||
this.indexLabel.Name = "indexLabel";
|
||||
this.indexLabel.Size = new System.Drawing.Size(52, 15);
|
||||
this.indexLabel.TabIndex = 0;
|
||||
this.indexLabel.Text = "Index: 0";
|
||||
//
|
||||
// nameLabel
|
||||
//
|
||||
this.nameLabel.AutoSize = true;
|
||||
this.nameLabel.Font = new System.Drawing.Font("Segoe UI", 9F);
|
||||
this.nameLabel.Location = new System.Drawing.Point(12, 35);
|
||||
this.nameLabel.Name = "nameLabel";
|
||||
this.nameLabel.Size = new System.Drawing.Size(45, 15);
|
||||
this.nameLabel.TabIndex = 1;
|
||||
this.nameLabel.Text = "Name: ";
|
||||
//
|
||||
// pidLabel
|
||||
//
|
||||
this.pidLabel.AutoSize = true;
|
||||
this.pidLabel.Font = new System.Drawing.Font("Segoe UI", 9F);
|
||||
this.pidLabel.Location = new System.Drawing.Point(12, 50);
|
||||
this.pidLabel.Name = "pidLabel";
|
||||
this.pidLabel.Size = new System.Drawing.Size(28, 15);
|
||||
this.pidLabel.TabIndex = 2;
|
||||
this.pidLabel.Text = "PID:";
|
||||
//
|
||||
// titleLabel
|
||||
//
|
||||
this.titleLabel.AutoSize = true;
|
||||
this.titleLabel.Font = new System.Drawing.Font("Segoe UI", 9F);
|
||||
this.titleLabel.Location = new System.Drawing.Point(12, 20);
|
||||
this.titleLabel.MaximumSize = new System.Drawing.Size(200, 0);
|
||||
this.titleLabel.Name = "titleLabel";
|
||||
this.titleLabel.Size = new System.Drawing.Size(36, 15);
|
||||
this.titleLabel.TabIndex = 3;
|
||||
this.titleLabel.Text = "Title: ";
|
||||
//
|
||||
// firstLastLabel
|
||||
//
|
||||
this.firstLastLabel.AutoSize = true;
|
||||
this.firstLastLabel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold);
|
||||
this.firstLastLabel.ForeColor = System.Drawing.Color.DarkBlue;
|
||||
this.firstLastLabel.Location = new System.Drawing.Point(200, 45);
|
||||
this.firstLastLabel.Name = "firstLastLabel";
|
||||
this.firstLastLabel.Size = new System.Drawing.Size(0, 15);
|
||||
this.firstLastLabel.TabIndex = 4;
|
||||
//
|
||||
// pickButton
|
||||
//
|
||||
this.pickButton.Location = new System.Drawing.Point(420, 10);
|
||||
this.pickButton.Name = "pickButton";
|
||||
this.pickButton.Size = new System.Drawing.Size(88, 25);
|
||||
this.pickButton.TabIndex = 5;
|
||||
this.pickButton.Text = "Pick";
|
||||
this.pickButton.UseVisualStyleBackColor = true;
|
||||
this.pickButton.Click += new System.EventHandler(this.pickButton_Click);
|
||||
//
|
||||
// untrackButton
|
||||
//
|
||||
this.untrackButton.Location = new System.Drawing.Point(420, 45);
|
||||
this.untrackButton.Name = "untrackButton";
|
||||
this.untrackButton.Size = new System.Drawing.Size(88, 25);
|
||||
this.untrackButton.TabIndex = 6;
|
||||
this.untrackButton.Text = "Untrack";
|
||||
this.untrackButton.UseVisualStyleBackColor = true;
|
||||
this.untrackButton.Click += new System.EventHandler(this.untrackButton_Click);
|
||||
//
|
||||
// WindowPanelForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.indexLabel);
|
||||
this.Controls.Add(this.nameLabel);
|
||||
this.Controls.Add(this.pidLabel);
|
||||
this.Controls.Add(this.titleLabel);
|
||||
this.Controls.Add(this.firstLastLabel);
|
||||
this.Controls.Add(this.pickButton);
|
||||
this.Controls.Add(this.untrackButton);
|
||||
this.Name = "WindowPanelForm";
|
||||
this.Size = new System.Drawing.Size(520, 80);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.Label indexLabel;
|
||||
private System.Windows.Forms.Label nameLabel;
|
||||
private System.Windows.Forms.Label pidLabel;
|
||||
private System.Windows.Forms.Label titleLabel;
|
||||
private System.Windows.Forms.Label firstLastLabel;
|
||||
private System.Windows.Forms.Button pickButton;
|
||||
private System.Windows.Forms.Button untrackButton;
|
||||
}
|
||||
}
|
47
DD2Switcher/WindowPanelForm.cs
Normal file
47
DD2Switcher/WindowPanelForm.cs
Normal file
@@ -0,0 +1,47 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace DD2Switcher {
|
||||
public partial class WindowPanelForm : UserControl {
|
||||
public event EventHandler<int> PickClicked;
|
||||
public event EventHandler<int> UntrackClicked;
|
||||
|
||||
public int WindowIndex { get; set; }
|
||||
public Process WindowProcess { get; set; }
|
||||
public bool IsFirst { get; set; }
|
||||
public bool IsLast { get; set; }
|
||||
|
||||
public WindowPanelForm() {
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public void UpdateDisplay() {
|
||||
if (WindowProcess != null) {
|
||||
indexLabel.Text = $"Index: {WindowIndex}";
|
||||
nameLabel.Text = $"Name: {WindowProcess.ProcessName}";
|
||||
pidLabel.Text = $"PID: {WindowProcess.Id}";
|
||||
titleLabel.Text = $"Title: {WindowProcess.MainWindowTitle}";
|
||||
|
||||
if (IsFirst && IsLast) {
|
||||
firstLastLabel.Text = "First & Last";
|
||||
} else if (IsFirst) {
|
||||
firstLastLabel.Text = "First";
|
||||
} else if (IsLast) {
|
||||
firstLastLabel.Text = "Last";
|
||||
} else {
|
||||
firstLastLabel.Text = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void pickButton_Click(object sender, EventArgs e) {
|
||||
PickClicked?.Invoke(this, WindowIndex);
|
||||
}
|
||||
|
||||
private void untrackButton_Click(object sender, EventArgs e) {
|
||||
UntrackClicked?.Invoke(this, WindowIndex);
|
||||
}
|
||||
}
|
||||
}
|
120
DD2Switcher/WindowPanelForm.resx
Normal file
120
DD2Switcher/WindowPanelForm.resx
Normal file
@@ -0,0 +1,120 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
BIN
DD2Switcher/app.ico
Normal file
BIN
DD2Switcher/app.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 106 KiB |
13
DD2Switcher/packages.config
Normal file
13
DD2Switcher/packages.config
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Microsoft.Bcl.AsyncInterfaces" version="9.0.8" targetFramework="net48" />
|
||||
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
|
||||
<package id="System.IO.Pipelines" version="9.0.8" targetFramework="net48" />
|
||||
<package id="System.Memory" version="4.5.5" targetFramework="net48" />
|
||||
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
|
||||
<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="net48" />
|
||||
<package id="System.Text.Encodings.Web" version="9.0.8" targetFramework="net48" />
|
||||
<package id="System.Text.Json" version="9.0.8" targetFramework="net48" />
|
||||
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
|
||||
<package id="System.ValueTuple" version="4.5.0" targetFramework="net48" />
|
||||
</packages>
|
Reference in New Issue
Block a user