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
|
.idea
|
||||||
obj
|
obj
|
||||||
bin
|
bin
|
||||||
.vs
|
.vs
|
||||||
|
packages
|
||||||
|
@@ -1,6 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<startup>
|
<startup>
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
|
||||||
</startup>
|
</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"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<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')"/>
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
<ProjectGuid>{2AC26899-8E27-4B96-85A9-C387186EAD27}</ProjectGuid>
|
<ProjectGuid>{2AC26899-8E27-4B96-85A9-C387186EAD27}</ProjectGuid>
|
||||||
<OutputType>WinExe</OutputType>
|
<OutputType>WinExe</OutputType>
|
||||||
<RootNamespace>DD2Switcher</RootNamespace>
|
<RootNamespace>DD2Switcher</RootNamespace>
|
||||||
<AssemblyName>DD2Switcher</AssemblyName>
|
<AssemblyName>DD2Switcher</AssemblyName>
|
||||||
<TargetFrameworkVersion>v4.8.1</TargetFrameworkVersion>
|
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
<Deterministic>true</Deterministic>
|
<Deterministic>true</Deterministic>
|
||||||
<LangVersion>9.0</LangVersion>
|
<LangVersion>9.0</LangVersion>
|
||||||
</PropertyGroup>
|
<TargetFrameworkProfile />
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
</PropertyGroup>
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
<DebugSymbols>true</DebugSymbols>
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
<DebugType>full</DebugType>
|
<DebugSymbols>true</DebugSymbols>
|
||||||
<Optimize>false</Optimize>
|
<DebugType>full</DebugType>
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
<Optimize>false</Optimize>
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<WarningLevel>4</WarningLevel>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<Prefer32bit>false</Prefer32bit>
|
<WarningLevel>4</WarningLevel>
|
||||||
</PropertyGroup>
|
<Prefer32bit>false</Prefer32bit>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
</PropertyGroup>
|
||||||
<PlatformTarget>x64</PlatformTarget>
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
<DebugType>pdbonly</DebugType>
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
<Optimize>true</Optimize>
|
<DebugType>pdbonly</DebugType>
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
<Optimize>true</Optimize>
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
<WarningLevel>4</WarningLevel>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<Prefer32bit>false</Prefer32bit>
|
<WarningLevel>4</WarningLevel>
|
||||||
</PropertyGroup>
|
<Prefer32bit>false</Prefer32bit>
|
||||||
<ItemGroup>
|
</PropertyGroup>
|
||||||
<Reference Include="System"/>
|
<ItemGroup>
|
||||||
<Reference Include="System.Core"/>
|
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=9.0.0.8, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<Reference Include="System.Xml.Linq"/>
|
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.8\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
|
||||||
<Reference Include="System.Data.DataSetExtensions"/>
|
</Reference>
|
||||||
<Reference Include="Microsoft.CSharp"/>
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Data"/>
|
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<Reference Include="System.Deployment"/>
|
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
|
||||||
<Reference Include="System.Drawing"/>
|
</Reference>
|
||||||
<Reference Include="System.Net.Http"/>
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="System.Windows.Forms"/>
|
<Reference Include="System.IO.Pipelines, Version=9.0.0.8, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<Reference Include="System.Xml"/>
|
<HintPath>..\packages\System.IO.Pipelines.9.0.8\lib\net462\System.IO.Pipelines.dll</HintPath>
|
||||||
</ItemGroup>
|
</Reference>
|
||||||
<ItemGroup>
|
<Reference Include="System.Memory, Version=4.0.1.2, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<Compile Include="Form1.cs">
|
<HintPath>..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll</HintPath>
|
||||||
<SubType>Form</SubType>
|
</Reference>
|
||||||
</Compile>
|
<Reference Include="System.Numerics" />
|
||||||
<Compile Include="Form1.Designer.cs">
|
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
<DependentUpon>Form1.cs</DependentUpon>
|
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
|
||||||
</Compile>
|
</Reference>
|
||||||
<Compile Include="HotKeyManager.cs"/>
|
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
<Compile Include="Program.cs"/>
|
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
|
||||||
<Compile Include="Properties\AssemblyInfo.cs"/>
|
</Reference>
|
||||||
<EmbeddedResource Include="Properties\Resources.resx">
|
<Reference Include="System.Text.Encodings.Web, Version=9.0.0.8, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<Generator>ResXFileCodeGenerator</Generator>
|
<HintPath>..\packages\System.Text.Encodings.Web.9.0.8\lib\net462\System.Text.Encodings.Web.dll</HintPath>
|
||||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
</Reference>
|
||||||
<SubType>Designer</SubType>
|
<Reference Include="System.Text.Json, Version=9.0.0.8, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
</EmbeddedResource>
|
<HintPath>..\packages\System.Text.Json.9.0.8\lib\net462\System.Text.Json.dll</HintPath>
|
||||||
<Compile Include="Properties\Resources.Designer.cs">
|
</Reference>
|
||||||
<AutoGen>True</AutoGen>
|
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<DependentUpon>Resources.resx</DependentUpon>
|
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
|
||||||
</Compile>
|
</Reference>
|
||||||
<None Include="Properties\Settings.settings">
|
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<Generator>SettingsSingleFileGenerator</Generator>
|
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
|
||||||
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
|
</Reference>
|
||||||
</None>
|
<Reference Include="System.Xml.Linq" />
|
||||||
<Compile Include="Properties\Settings.Designer.cs">
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
<AutoGen>True</AutoGen>
|
<Reference Include="Microsoft.CSharp" />
|
||||||
<DependentUpon>Settings.settings</DependentUpon>
|
<Reference Include="System.Data" />
|
||||||
<DesignTimeSharedInput>True</DesignTimeSharedInput>
|
<Reference Include="System.Deployment" />
|
||||||
</Compile>
|
<Reference Include="System.Drawing" />
|
||||||
</ItemGroup>
|
<Reference Include="System.Net.Http" />
|
||||||
<ItemGroup>
|
<Reference Include="System.Windows.Forms" />
|
||||||
<None Include="App.config"/>
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Content Include="beep.wav"/>
|
<Compile Include="Form1.cs">
|
||||||
</ItemGroup>
|
<SubType>Form</SubType>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets"/>
|
</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>
|
</Project>
|
110
DD2Switcher/Form1.Designer.cs
generated
110
DD2Switcher/Form1.Designer.cs
generated
@@ -1,36 +1,92 @@
|
|||||||
namespace DD2Switcher {
|
namespace DD2Switcher {
|
||||||
partial class Form1 {
|
partial class Form1 {
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Required designer variable.
|
/// Required designer variable.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private System.ComponentModel.IContainer components = null;
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Clean up any resources being used.
|
/// Clean up any resources being used.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="disposing">true if managed resources should be disposed;
|
/// <param name="disposing">true if managed resources should be disposed;
|
||||||
/// otherwise, false.</param>
|
/// otherwise, false.</param>
|
||||||
protected override void Dispose(bool disposing) {
|
protected override void Dispose(bool disposing) {
|
||||||
if (disposing && (components != null)) {
|
if (disposing && (components != null)) {
|
||||||
components.Dispose();
|
components.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
base.Dispose(disposing);
|
base.Dispose(disposing);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Windows Form Designer generated code
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Required method for Designer support - do not modify
|
/// Required method for Designer support - do not modify
|
||||||
/// the contents of this method with the code editor.
|
/// the contents of this method with the code editor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private void InitializeComponent() {
|
private void InitializeComponent() {
|
||||||
this.components = new System.ComponentModel.Container();
|
this.components = new System.ComponentModel.Container();
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components);
|
||||||
this.ClientSize = new System.Drawing.Size(800, 450);
|
this.trayMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
|
||||||
this.Text = "Form1";
|
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
|
#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 {
|
namespace DD2Switcher {
|
||||||
public partial class Form1 : Form {
|
public partial class Form1 : Form {
|
||||||
public Form1() { InitializeComponent(); }
|
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;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
namespace DD2Switcher {
|
namespace DD2Switcher {
|
||||||
public static class HotKeyManager {
|
public static class HotKeyManager {
|
||||||
private static volatile MessageWindow _wnd;
|
private static volatile MessageWindow _wnd;
|
||||||
private static volatile IntPtr _hwnd;
|
private static volatile IntPtr _hwnd;
|
||||||
private static readonly ManualResetEvent _windowReadyEvent = new(false);
|
private static readonly ManualResetEvent _windowReadyEvent = new(false);
|
||||||
|
|
||||||
private static int _id;
|
private static int _id;
|
||||||
|
|
||||||
static HotKeyManager() {
|
static HotKeyManager() {
|
||||||
var messageLoop =
|
var messageLoop = new Thread(delegate() { Application.Run(new MessageWindow()); });
|
||||||
new Thread(delegate() { Application.Run(new MessageWindow()); });
|
messageLoop.Name = "MessageLoopThread";
|
||||||
messageLoop.Name = "MessageLoopThread";
|
messageLoop.IsBackground = true;
|
||||||
messageLoop.IsBackground = true;
|
messageLoop.Start();
|
||||||
messageLoop.Start();
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public static event EventHandler<HotKeyEventArgs> HotKeyPressed;
|
public static event EventHandler<HotKeyEventArgs> HotKeyPressed;
|
||||||
|
|
||||||
public static int RegisterHotKey(Keys key, KeyModifiers modifiers) {
|
public static int RegisterHotKey(Keys key, KeyModifiers modifiers) {
|
||||||
_windowReadyEvent.WaitOne();
|
_windowReadyEvent.WaitOne();
|
||||||
var id = Interlocked.Increment(ref _id);
|
var id = Interlocked.Increment(ref _id);
|
||||||
_wnd.Invoke(new RegisterHotKeyDelegate(RegisterHotKeyInternal), _hwnd, id,
|
_wnd.Invoke(new RegisterHotKeyDelegate(RegisterHotKeyInternal), _hwnd, id, (uint)modifiers, (uint)key);
|
||||||
(uint)modifiers, (uint)key);
|
return id;
|
||||||
return id;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
public static void UnregisterHotKey(int id) {
|
public static void UnregisterHotKey(int id) {
|
||||||
_wnd.Invoke(new UnRegisterHotKeyDelegate(UnRegisterHotKeyInternal), _hwnd,
|
_wnd.Invoke(new UnRegisterHotKeyDelegate(UnRegisterHotKeyInternal), _hwnd, id);
|
||||||
id);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private static void RegisterHotKeyInternal(IntPtr hwnd, int id,
|
private static void RegisterHotKeyInternal(IntPtr hwnd, int id, uint modifiers, uint key) {
|
||||||
uint modifiers, uint key) {
|
RegisterHotKey(hwnd, id, modifiers, key);
|
||||||
RegisterHotKey(hwnd, id, modifiers, key);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private static void UnRegisterHotKeyInternal(IntPtr hwnd, int id) {
|
private static void UnRegisterHotKeyInternal(IntPtr hwnd, int id) {
|
||||||
UnregisterHotKey(_hwnd, id);
|
UnregisterHotKey(_hwnd, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void OnHotKeyPressed(HotKeyEventArgs e) {
|
private static void OnHotKeyPressed(HotKeyEventArgs e) {
|
||||||
if (HotKeyPressed != null)
|
if (HotKeyPressed != null)
|
||||||
HotKeyPressed(null, e);
|
HotKeyPressed(null, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
[DllImport("user32", SetLastError = true)]
|
[DllImport("user32", SetLastError = true)]
|
||||||
private static extern bool RegisterHotKey(IntPtr hWnd, int id,
|
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk);
|
||||||
uint fsModifiers, uint vk);
|
|
||||||
|
|
||||||
[DllImport("user32", SetLastError = true)]
|
[DllImport("user32", SetLastError = true)]
|
||||||
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
|
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
|
||||||
|
|
||||||
private delegate void RegisterHotKeyDelegate(IntPtr hwnd, int id,
|
private delegate void RegisterHotKeyDelegate(IntPtr hwnd, int id, uint modifiers, uint key);
|
||||||
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 class MessageWindow : Form {
|
||||||
private const int WM_HOTKEY = 0x312;
|
private const int WM_HOTKEY = 0x312;
|
||||||
|
|
||||||
public MessageWindow() {
|
public MessageWindow() {
|
||||||
_wnd = this;
|
_wnd = this;
|
||||||
_hwnd = Handle;
|
_hwnd = Handle;
|
||||||
_windowReadyEvent.Set();
|
_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) {
|
public class HotKeyEventArgs : EventArgs {
|
||||||
if (m.Msg == WM_HOTKEY) {
|
public readonly Keys Key;
|
||||||
var e = new HotKeyEventArgs(m.LParam);
|
public readonly KeyModifiers Modifiers;
|
||||||
OnHotKeyPressed(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
[Flags]
|
||||||
// Ensure the window never becomes visible
|
public enum KeyModifiers { Alt = 1, Control = 2, Shift = 4, Windows = 8, NoRepeat = 0x4000 }
|
||||||
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
|
|
||||||
}
|
|
||||||
}
|
}
|
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 {
|
namespace DD2Switcher.Properties {
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||||
// class via a tool like ResGen or Visual Studio.
|
// class via a tool like ResGen or Visual Studio.
|
||||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||||
// with the /str option, or rebuild your VS project.
|
// with the /str option, or rebuild your VS project.
|
||||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder",
|
||||||
"System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
"17.0.0.0")]
|
||||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
internal class Resources {
|
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(
|
/// <summary>
|
||||||
"Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
/// Returns the cached ResourceManager instance used by this class.
|
||||||
internal Resources() {}
|
/// </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>
|
/// <summary>
|
||||||
/// Returns the cached ResourceManager instance used by this class.
|
/// Overrides the current thread's CurrentUICulture property for all
|
||||||
/// </summary>
|
/// resource lookups using this strongly typed resource class.
|
||||||
[global::System.ComponentModel.EditorBrowsableAttribute(
|
/// </summary>
|
||||||
global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
[global::System.ComponentModel.EditorBrowsableAttribute(
|
||||||
internal static global::System.Resources.ResourceManager ResourceManager {
|
global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
get {
|
internal static global::System.Globalization.CultureInfo Culture {
|
||||||
if (object.ReferenceEquals(resourceMan, null)) {
|
get { return resourceCulture; }
|
||||||
global::System.Resources.ResourceManager temp =
|
set { resourceCulture = value; }
|
||||||
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; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
24
DD2Switcher/Properties/Settings.Designer.cs
generated
24
DD2Switcher/Properties/Settings.Designer.cs
generated
@@ -9,18 +9,16 @@
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
namespace DD2Switcher.Properties {
|
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 {
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
get { return defaultInstance; }
|
[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