V1.0 - Initial Release

This commit is contained in:
Bouletmarc 2022-04-21 07:03:17 -04:00 committed by GitHub
parent 4b67f588fc
commit 8c12fe38da
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 1115 additions and 0 deletions

88
COMPortReseter.csproj Normal file
View File

@ -0,0 +1,88 @@
<?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>{9256129B-DE42-45C9-9C5E-B9FE60BA6BFD}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>COMPortReseter</RootNamespace>
<AssemblyName>COMPortReseter</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>serial_port_computer_qV2ky.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup />
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
</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.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="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<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>
<Content Include="serial_port_computer_qV2ky.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

104
Form1.Designer.cs generated Normal file
View File

@ -0,0 +1,104 @@
namespace COMPortReseter
{
partial class Form1
{
/// <summary>
/// Variable nécessaire au concepteur.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Nettoyage des ressources utilisées.
/// </summary>
/// <param name="disposing">true si les ressources managées doivent être supprimées ; sinon, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Code généré par le Concepteur Windows Form
/// <summary>
/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
/// le contenu de cette méthode avec l'éditeur de code.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.checkedListBox1 = new System.Windows.Forms.CheckedListBox();
this.button1 = new System.Windows.Forms.Button();
this.button2 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// checkedListBox1
//
this.checkedListBox1.CheckOnClick = true;
this.checkedListBox1.FormattingEnabled = true;
this.checkedListBox1.Location = new System.Drawing.Point(12, 46);
this.checkedListBox1.Name = "checkedListBox1";
this.checkedListBox1.Size = new System.Drawing.Size(283, 619);
this.checkedListBox1.TabIndex = 0;
this.checkedListBox1.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.checkedListBox1_ItemCheck);
//
// button1
//
this.button1.Location = new System.Drawing.Point(35, 670);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 1;
this.button1.Text = "Cancel";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// button2
//
this.button2.Location = new System.Drawing.Point(184, 670);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 2;
this.button2.Text = "Save";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// label1
//
this.label1.AutoSize = true;
this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label1.ForeColor = System.Drawing.Color.Blue;
this.label1.Location = new System.Drawing.Point(31, 16);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(242, 16);
this.label1.TabIndex = 3;
this.label1.Text = "SET or RESET COM Ports IN USE";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(308, 700);
this.Controls.Add(this.label1);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.checkedListBox1);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "Form1";
this.Text = "COM Ports Reseter";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.CheckedListBox checkedListBox1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Label label1;
}
}

253
Form1.cs Normal file
View File

@ -0,0 +1,253 @@
using System;
using Microsoft.Win32;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Windows.Forms;
using System.ComponentModel;
using System.Diagnostics;
using System.Reflection;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.Security.Principal;
using System.Management;
namespace COMPortReseter
{
public partial class Form1 : Form
{
public SerialPort serial;
public List<string> AvailablePorts = new List<string>(); //Available COM Ports List
public string RegistryKeyAccess = @"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter";
public string ThisKeyName = "ComDB";
public byte[] COM_Ports_Bytes = new byte[] { };
public byte[] ClearData = new byte[] { 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00 };
public byte[] COM_Ports_Bytes_NEW = new byte[] { };
public byte[] NewByte = new byte[1] { 0x00 };
public bool LoadingValues = true;
public Form1()
{
InitializeComponent();
AdminRelauncher();
SpawnList();
LoadingValues = false;
}
private void AdminRelauncher()
{
if (!IsRunAsAdmin())
{
ProcessStartInfo proc = new ProcessStartInfo();
proc.UseShellExecute = true;
proc.WorkingDirectory = Environment.CurrentDirectory;
try
{
proc.FileName = Assembly.GetEntryAssembly().CodeBase;
}
catch
{
proc.FileName = Application.ExecutablePath;
}
proc.Verb = "runas";
try
{
Process.Start(proc);
}
catch { }
Environment.Exit(0);
}
}
private bool IsRunAsAdmin()
{
WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(id);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
public void GetRegistryKey(string KeyName)
{
COM_Ports_Bytes = (byte[]) Registry.GetValue(RegistryKeyAccess, KeyName, ClearData);
if (COM_Ports_Bytes != null)
{
COM_Ports_Bytes_NEW = COM_Ports_Bytes;
int CurrentByte = 0;
int CurrentBit = 0;
LoadingValues = true;
for (int i = 0; i < 40; i++)
{
if (GetBit(COM_Ports_Bytes[CurrentByte], CurrentBit))
{
checkedListBox1.SetItemChecked(i, true);
}
CurrentBit++;
if (CurrentBit >= 8)
{
CurrentByte++;
CurrentBit = 0;
}
}
}
else
{
MessageBox.Show("No Value in COM Name Arbiter");
}
}
public void SetBit(int ByteNubmer, int bitNumber, bool Activated)
{
Console.WriteLine("StartByte: " + COM_Ports_Bytes_NEW[ByteNubmer].ToString("X2"));
BitArray bitArray = new BitArray(new byte[] {COM_Ports_Bytes_NEW[ByteNubmer]});
bitArray.Set(bitNumber, Activated);
bitArray.CopyTo(NewByte, 0);
Console.WriteLine("EndByte: " + COM_Ports_Bytes_NEW[ByteNubmer].ToString("X2"));
COM_Ports_Bytes_NEW[ByteNubmer] = NewByte[0];
}
public bool GetBit(byte b, int bitNumber)
{
return (b & (1 << bitNumber)) != 0;
}
public void SetRegistryKey(string KeyName)
{
try
{
Registry.SetValue(RegistryKeyAccess, KeyName, COM_Ports_Bytes_NEW, RegistryValueKind.Binary);
}
catch (Exception mess)
{
MessageBox.Show("Error setting RegistryKey:" + Environment.NewLine + mess);
}
}
public void RegistryDemandPermission()
{
RegistryPermission permission = new RegistryPermission(RegistryPermissionAccess.AllAccess, RegistryKeyAccess);
permission.Demand();
permission = null;
}
public void SpawnList()
{
AvailablePorts.Clear();
foreach (string s in SerialPort.GetPortNames())
{
AvailablePorts.Add(s);
}
checkedListBox1.Items.Clear();
LoadingValues = true;
for (int i = 0; i < 40; i++)
{
string COMName = "COM" + i;
string BufFinalName = GetPortName(COMName);
if (BufFinalName != "")
{
checkedListBox1.Items.Add(COMName + " | Connected | " + BufFinalName);
}
else
{
checkedListBox1.Items.Add(COMName);
}
checkedListBox1.SetItemChecked(i, false);
}
//#########################
RegistryDemandPermission();
GetRegistryKey(ThisKeyName);
}
public string GetPortName(string ThisCOM)
{
for (int i = 0; i < AvailablePorts.Count; i++)
{
if (AvailablePorts[i] == ThisCOM)
{
return AvailablePorts[i];
}
}
return "";
}
private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
/*if (!LoadingValues)
{
int CurrentByte = 0;
int CurrentBit = 0;
for (int i = 0; i < 40; i++)
{
SetBit(CurrentByte, CurrentBit, checkedListBox1.GetItemChecked(i));
CurrentBit++;
if (CurrentBit >= 8)
{
CurrentByte++;
CurrentBit = 0;
}
}
SetRegistryKey(ThisKeyName);
SpawnList(); //respawn list
LoadingValues = false;
}*/
}
private void button1_Click(object sender, EventArgs e)
{
COM_Ports_Bytes_NEW = COM_Ports_Bytes;
RegistryDemandPermission();
SetRegistryKey(ThisKeyName);
SpawnList(); //respawn list
LoadingValues = false;
}
private void button2_Click(object sender, EventArgs e)
{
if (!LoadingValues)
{
int CurrentByte = 0;
int CurrentBit = 0;
for (int i = 0; i < 40; i++)
{
SetBit(CurrentByte, CurrentBit, checkedListBox1.GetItemChecked(i));
CurrentBit++;
if (CurrentBit >= 8)
{
CurrentByte++;
CurrentBit = 0;
}
}
RegistryDemandPermission();
SetRegistryKey(ThisKeyName);
SpawnList(); //respawn list
LoadingValues = false;
}
}
}
}

304
Form1.resx Normal file
View File

@ -0,0 +1,304 @@
<?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>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

21
Program.cs Normal file
View File

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace COMPortReseter
{
static class Program
{
/// <summary>
/// Point d'entrée principal de l'application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Les informations générales relatives à un assembly dépendent de
// l'ensemble d'attributs suivant. Changez les valeurs de ces attributs pour modifier les informations
// associées à un assembly.
[assembly: AssemblyTitle("COMPortReseter")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("COMPortReseter")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// L'affectation de la valeur false à ComVisible rend les types invisibles dans cet assembly
// aux composants COM. Si vous devez accéder à un type dans cet assembly à partir de
// COM, affectez la valeur true à l'attribut ComVisible sur ce type.
[assembly: ComVisible(false)]
// Le GUID suivant est pour l'ID de la typelib si ce projet est exposé à COM
[assembly: Guid("9256129b-de42-45c9-9c5e-b9fe60ba6bfd")]
// Les informations de version pour un assembly se composent des quatre valeurs suivantes :
//
// Version principale
// Version secondaire
// Numéro de build
// Révision
//
// Vous pouvez spécifier toutes les valeurs ou indiquer les numéros de build et de révision par défaut
// en utilisant '*', comme indiqué ci-dessous :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

71
Properties/Resources.Designer.cs generated Normal file
View File

@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Ce code a été généré par un outil.
// Version du runtime :4.0.30319.42000
//
// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
// le code est régénéré.
// </auto-generated>
//------------------------------------------------------------------------------
namespace COMPortReseter.Properties
{
/// <summary>
/// Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées.
/// </summary>
// Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder
// à l'aide d'un outil, tel que ResGen ou Visual Studio.
// Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen
// avec l'option /str ou régénérez votre projet VS.
[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
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Retourne l'instance ResourceManager mise en cache utilisée par cette classe.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("COMPortReseter.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Remplace la propriété CurrentUICulture du thread actuel pour toutes
/// les recherches de ressources à l'aide de cette classe de ressource fortement typée.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

117
Properties/Resources.resx Normal file
View File

@ -0,0 +1,117 @@
<?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.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: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" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</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" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</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=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

30
Properties/Settings.Designer.cs generated Normal file
View File

@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace COMPortReseter.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;
}
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

76
app.manifest Normal file
View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<!-- Options du manifeste de contrôle de compte d'utilisateur
Si vous souhaitez modifier le niveau du contrôle de compte d'utilisateur Windows, remplacez le
nœud requestedExecutionLevel par l'une des propositions suivantes.
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
La spécification de l'élément requestedExecutionLevel désactive la virtualisation de fichiers et du Registre.
Supprimez cet élément si votre application a besoin de la virtualisation pour des
raisons de compatibilité descendante.
-->
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Liste des versions de Windows pour lesquelles cette application a été testée, et sur
lesquelles elle doit fonctionner. Supprimez les marques de commentaire des éléments appropriés, et Windows va
automatiquement sélectionner l'environnement le plus compatible. -->
<!-- Windows Vista -->
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
<!-- Windows 7 -->
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
<!-- Windows 8 -->
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
<!-- Windows 8.1 -->
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
<!-- Windows 10 -->
<!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
</application>
</compatibility>
<!-- Indique que l'application prend en charge DPI et qu'elle n'est pas automatiquement mise à l'échelle par Windows à un niveau de
DPI plus élevé. Les applications Windows Presentation Foundation (WPF) prennent automatiquement en charge DPI et n'ont pas besoin
d'opter pour ce choix. Les applications Windows Forms qui ciblent .NET Framework 4.6 et qui optent pour ce paramètre, doivent
également affecter la valeur 'true' au paramètre 'EnableWindowsFormsHighDpiAutoResizing' dans leur fichier app.config. -->
<!--
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
-->
<!-- Activer les thèmes pour les contrôles et boîtes de dialogue communes de Windows (Windows XP et version ultérieure) -->
<!--
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
-->
</assembly>

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,8 @@
C:\Users\boule\Documents\Visual Studio 2019\Projects\COMPortReseter\COMPortReseter\bin\Debug\COMPortReseter.exe
C:\Users\boule\Documents\Visual Studio 2019\Projects\COMPortReseter\COMPortReseter\bin\Debug\COMPortReseter.pdb
C:\Users\boule\Documents\Visual Studio 2019\Projects\COMPortReseter\COMPortReseter\obj\Debug\COMPortReseter.csprojAssemblyReference.cache
C:\Users\boule\Documents\Visual Studio 2019\Projects\COMPortReseter\COMPortReseter\obj\Debug\COMPortReseter.Form1.resources
C:\Users\boule\Documents\Visual Studio 2019\Projects\COMPortReseter\COMPortReseter\obj\Debug\COMPortReseter.Properties.Resources.resources
C:\Users\boule\Documents\Visual Studio 2019\Projects\COMPortReseter\COMPortReseter\obj\Debug\COMPortReseter.csproj.GenerateResource.cache
C:\Users\boule\Documents\Visual Studio 2019\Projects\COMPortReseter\COMPortReseter\obj\Debug\COMPortReseter.exe
C:\Users\boule\Documents\Visual Studio 2019\Projects\COMPortReseter\COMPortReseter\obj\Debug\COMPortReseter.pdb

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB