Outil de discussion instantanée sur répertoire partagé
Bonjour,
J'ai toujours trouvé ça pratique de pouvoir discuter avec mes collègues via un système de messagerie instantanée. Plus rapide que le mail et moins intrusif que le téléphone.
J'ai eu accès à des logiciels d'entreprise, comme SameTime par exemple pour ceux qui connaissent, mais ce n'est plus le cas. J'ai utilisé un peu le Chat Gmail, mais il vient d'être bloqué. Et autant dire que les systèmes standard sont bloqués de partout. Même NetSend ne marche pas.
Du coup, j'ai décidé de développer une petite application pour ça et la seule idée que j'ai eu était de passer par un fichier dans un répertoire auquel les utilisateurs avaient accès.
J'ai fait ça très rapidement donc c'est sûrement largement perfectible, surtout que je ne suis pas développeur de formation ou de métier.
Voici donc le résultat :
Pour le moment, j'utilise un fichier par utilisateur et par conversation. C'est ça qui est le moins pratique à mon avis mais bon, c'est un début. Je ne l'utilise qu'avec une personne pour le moment donc je n'ai pas mis de mot de passe, mais c'est un étape indispensable si on veut passer à plus d'une personne.
Voici tout d'abord le fichier app.config avec les chemins et le pseudo :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<!-- Example connection to a SQL Server Database on localhost. -->
<!-- <add name="ExampleConnectionString"
connectionString="Data Source=.;Initial Catalog=DBName;Integrated Security=True"
providerName="System.Data.SqlClient" /> -->
</connectionStrings>
<appSettings>
<!-- access these values via the property:
System.Configuration.ConfigurationManager.AppSettings[key]
-->
<add key="cheminUtilisateur" value="D:\DONNEES\testChat\FichiersDiscussion\fichierUser" />
<add key="cheminDestinataire" value="D:\DONNEES\testChat\FichiersDiscussion\fichierCorrespondant" />
<add key="nomUtilisateur" value="monPseudo" />
</appSettings>
</configuration> |
Ensuite, voilà la classe qui sert à stocker les messages. Je les sérialize dans un fichier binaire que je crypte ensuite pour qu'il ne soit lisible avec notepad.
clsListeMessages.cs
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Security.Cryptography;
namespace sebChat
{
/// <summary>
/// Une liste de message pour un utilisateur
/// </summary>
[Serializable]
public class clsListeMessages
{
/// <summary>
/// Le nom de la personne ayant écrit le message
/// </summary>
public string NomUtilisateur { get; set; }
/// <summary>
/// La liste des messages
/// </summary>
public List<clsMessage> ListeMessages { get; set; }
/// <summary>
/// Dernière date et heure d'activité de l'application
/// </summary>
public DateTime DerniereVerifActivite { get; set; }
/// <summary>
/// Pour savoir si l'utilisateur bouge sa souris ou pas
/// </summary>
public bool UtilisateurActif { get; set; }
public clsListeMessages()
{
ListeMessages=new List<clsMessage>();
}
/// <summary>
/// Sérialise la liste des messages dans un fichier, avec un cryptage
/// </summary>
/// <param name="fileName">Le nom du fichier</param>
/// <param name="algoChiffrement">Pour le cryptage</param>
public void Save(string fileName, RijndaelManaged algoChiffrement)
{
int nbEssai = 0;
bool saveOk = false;
while (saveOk == false) {
try {
FileStream fs = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.Read);
CryptoStream cs = new CryptoStream(fs, algoChiffrement.CreateEncryptor(), CryptoStreamMode.Write);
BinaryFormatter fm = new BinaryFormatter();
fm.Serialize(cs, this);
cs.Close();
fs.Close();
saveOk = true;
} catch (Exception) {}
if (nbEssai > 5) {
throw new Exception("L'écriture dans le fichier a échouée 5 fois");
}
nbEssai++;
}
}
/// <summary>
/// Lit un fichier de messages, le décrypte et le désérialise
/// </summary>
/// <param name="fileName">Le nom du fichier</param>
/// <param name="algoChiffrement">Pour le décryptage</param>
/// <returns>Liste de messages</returns>
public static clsListeMessages Load(string fileName, RijndaelManaged algoChiffrement)
{
FileStream fs;
CryptoStream cs;
BinaryFormatter fm = new BinaryFormatter();
clsListeMessages lm;
try {
fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Write);
cs = new CryptoStream(fs, algoChiffrement.CreateDecryptor(), CryptoStreamMode.Read);
lm = (clsListeMessages)fm.Deserialize(cs);
cs.Close();
fs.Close();
return lm;
} catch (Exception) {
return new clsListeMessages();
}
}
}
/// <summary>
/// Un message
/// </summary>
[Serializable]
public class clsMessage
{
/// <summary>
/// La date du message
/// </summary>
public DateTime DateMessage { get; set; }
/// <summary>
/// Le contenu du message
/// </summary>
public string Message { get; set; }
/// <summary>
/// Type de rédacteur, ne servira qu'à la reconstitution
/// </summary>
public eTypeRedacteur TypeRedacteur { get; set; }
}
/// <summary>
/// Pour savoir si le rédacteur d'un message est l'utilisateur ou le destinataire
/// </summary>
public enum eTypeRedacteur : byte
{
Utilisateur = 1,
Destinataire = 2
}
} |
Ensuite le code de la discussion, utilisant 2 listes de messages
clsDiscussion.cs
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
| using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace sebChat
{
/// <summary>
/// Une discussion entre 2 utilisateurs
/// </summary>
public class clsDiscussion
{
private clsListeMessages _msgUtilisateur;
private clsListeMessages _msgDestinataire;
private DateTime _dernierMessageRecu;
private clsListeMessages _msgComplet;
private RijndaelManaged algoChiffrement;
/// <summary>
/// Le chemin du fichier de sauvegarde de l'utilisateur
/// </summary>
public string CheminUtilisateur { get; set; }
/// <summary>
/// Le chemin du fichier de sauvegarde du correspondant
/// </summary>
public string CheminDestinataire { get; set; }
/// <summary>
/// Indique si un nouveau message a été reçu ou pas
/// </summary>
public bool NouveauMessage { get; set; }
/// <summary>
/// La liste complete des messages
/// </summary>
public clsListeMessages ListeComplete
{ get { return _msgComplet; } }
/// <summary>
/// Le nom de l'utilisateur
/// </summary>
public string NomUtilisateur { get; set; }
/// <summary>
/// Le nom du destinataire
/// </summary>
public string NomDestinataire { get; set; }
/// <summary>
/// Si l'utilisateur bouge sa souris
/// </summary>
public bool DestinataireActif { get{ return _msgDestinataire.UtilisateurActif; } }
/// <summary>
/// Heure de dernière activité du destinataire, pour savoir si son appli est lancée
/// </summary>
public DateTime DerniereActiviteDestinataire { get{ return _msgDestinataire.DerniereVerifActivite; } }
/// <summary>
/// La souris est active ou pas
/// </summary>
public bool SourisActive { get; set; }
public clsDiscussion()
{
CheminUtilisateur = "";
CheminDestinataire = "";
NomUtilisateur = System.Configuration.ConfigurationManager.AppSettings["nomUtilisateur"];
InitAlgoChiffrement();
}
//Initialise l'algorithme de cryptage
private void InitAlgoChiffrement()
{
algoChiffrement = new RijndaelManaged();
Rfc2898DeriveBytes cle = new Rfc2898DeriveBytes("123456789", Encoding.ASCII.GetBytes("Un peu de sel"));
algoChiffrement.Key = cle.GetBytes(algoChiffrement.KeySize/8);
algoChiffrement.IV = cle.GetBytes(algoChiffrement.BlockSize/8);
}
/// <summary>
/// Lit les messages de l'utilisateur à partir du fichier
/// </summary>
public void LireMessagesUtilisateur()
{
_msgUtilisateur = clsListeMessages.Load(CheminUtilisateur, algoChiffrement);
}
/// <summary>
/// Lit les message de l'interlocuteur à partir du fichier et vérifie s'il y en a des nouveaux
/// </summary>
public void LireMessagesDestinataire()
{
_msgDestinataire = clsListeMessages.Load(CheminDestinataire, algoChiffrement);
NomDestinataire = (_msgDestinataire.NomUtilisateur == null) ? "Destinataire" : _msgDestinataire.NomUtilisateur;
//Vérification d'un nouveau message
DateTime dernierMsg;
var rq = from m in _msgDestinataire.ListeMessages
orderby m.DateMessage
select m;
if (rq.Count() > 0) {
dernierMsg = rq.Last().DateMessage;
NouveauMessage = (dernierMsg > _dernierMessageRecu);
_dernierMessageRecu = dernierMsg;
}
else {
NouveauMessage = false;
}
}
/// <summary>
/// Ecrit un message dans le fichier utilisateur
/// </summary>
/// <param name="strMsg">Le contenu du message</param>
public void EcrireMessageUtilisateur(string strMsg)
{
clsMessage msg = new clsMessage();
msg.DateMessage = DateTime.Now;
msg.Message = strMsg;
_msgUtilisateur.ListeMessages.Add(msg);
_msgUtilisateur.NomUtilisateur = NomUtilisateur;
_msgUtilisateur.Save(CheminUtilisateur, algoChiffrement);
}
public void DefinirActiviteSouris()
{
_msgUtilisateur.UtilisateurActif = SourisActive;
_msgUtilisateur.Save(CheminUtilisateur, algoChiffrement);
}
/// <summary>
/// Entre dans le fichier l'heure d'activité pour vérification d'application active
/// </summary>
public void EntrerHeureActivite()
{
_msgUtilisateur.DerniereVerifActivite = DateTime.Now;
_msgUtilisateur.Save(CheminUtilisateur, algoChiffrement);
}
/// <summary>
/// Regroupe les listes de message utilisateur et correspondant en y ajoutant les informations sur la personne qui a écrit chaque message
/// </summary>
public void ConstruitListeComplete()
{
_msgComplet = new clsListeMessages();
foreach (clsMessage tmpMsg in _msgUtilisateur.ListeMessages) {
tmpMsg.TypeRedacteur = eTypeRedacteur.Utilisateur;
_msgComplet.ListeMessages.Add(tmpMsg);
}
foreach (clsMessage tmpMsg in _msgDestinataire.ListeMessages) {
tmpMsg.TypeRedacteur = eTypeRedacteur.Destinataire;
_msgComplet.ListeMessages.Add(tmpMsg);
}
}
}
} |
Et pour finir le code du userForm, dans lequel j'utilise une CheckBox chbxAlerte pour savoir si on active les alertes de nouveau message (clignotement dans la barre des tâches), un Label lblCorrespondant pour connaitre l'activité du correspondant (connecté, absent - je teste le déplacement de la souris, présent), une DataGridView dgHisto pour l'historique des messages, un TextBox txtMessage pour écrire un message, un Button btnSend pour l'envoi du message (fonctionne aussi en appuyant sur Enter), et un Timer timerCheck pour vérifier les nouveaux messages, l'activité....
De toute façon, je mets aussi le code du designer...
MainForm.cs
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
| using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Linq;
using System.Runtime.InteropServices;
namespace sebChat
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class MainForm : Form
{
[DllImport("user32.dll")]
private static extern bool FlashWindow(IntPtr hwnd, bool bInvert); //Pour faire clignoter lors d'une alerte
private clsDiscussion _discussion;
private Point _dernierePositionSouris;
private int _nbTick;
private int _nbTickSourisInactive;
public MainForm()
{
//
// The InitializeComponent() call is required for Windows Forms designer support.
//
InitializeComponent();
//
_discussion = new clsDiscussion();
_discussion.CheminUtilisateur = System.Configuration.ConfigurationManager.AppSettings["cheminUtilisateur"];
_discussion.CheminDestinataire = System.Configuration.ConfigurationManager.AppSettings["cheminDestinataire"];
//Première lecture
_discussion.LireMessagesUtilisateur();
_discussion.LireMessagesDestinataire();
_discussion.ConstruitListeComplete();
//Config du datagrid
dgHisto.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
RemplirListView();
//Config des timers
timerCheck.Start();
_dernierePositionSouris = Cursor.Position;
_discussion.SourisActive = false;
_nbTick = 0;
_nbTickSourisInactive = 0;
//
}
//Remplissage du datagrid
private void RemplirListView()
{
var rq = from m in _discussion.ListeComplete.ListeMessages
orderby m.DateMessage descending
select m;
dgHisto.Rows.Clear();
DataGridViewRow dgRow;
string nom;
foreach (clsMessage msg in rq) {
dgRow = new DataGridViewRow();
nom = (msg.TypeRedacteur == eTypeRedacteur.Utilisateur) ? _discussion.NomUtilisateur : _discussion.NomDestinataire;
dgRow.CreateCells(dgHisto);
dgRow.Cells[0].Value = nom + Environment.NewLine + msg.DateMessage.ToString("dd/MM/yyyy") + Environment.NewLine
+ msg.DateMessage.ToString("H'h'mm");
dgRow.Cells[1].Value = msg.Message;
if (msg.TypeRedacteur == eTypeRedacteur.Utilisateur) {
dgRow.DefaultCellStyle.BackColor = Color.LightGray;
}
dgRow.DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dgHisto.Rows.Add(dgRow);
}
dgHisto.ClearSelection();
}
//Envoi d'un message
void BtnSendClick(object sender, EventArgs e)
{
if (txtMessage.Text != "") {
try {
_discussion.EcrireMessageUtilisateur(txtMessage.Text);
} catch (Exception ex) {
MessageBox.Show(ex.Message);
}
_discussion.ConstruitListeComplete();
RemplirListView();
txtMessage.Text = "";
}
}
//Pour empêcher la selection d'une ligne du datagrid
void DgHistoSelectionChanged(object sender, EventArgs e)
{
dgHisto.ClearSelection();
}
//Le timer de check des messages du correspondant
void TimerCheckTick(object sender, EventArgs e)
{
_nbTick++;
//Vérification des messages
if ((_nbTick % 2) == 0) { //Toutes les 2s
VerifMessages();
}
//Vérification de l'inactivité de la souris
VerifSouris();
//Vérification de l'activité
VerifEtatAutre();
if ((_nbTick % 30) == 0) { //Toutes les 30 s, on entre l'heure pour la vérification d'activité
_discussion.EntrerHeureActivite();
}
if (_nbTick >= 3600) { _nbTick = 0; } //On réinitialise au bout d'une heure
}
//Vérification des nouveaux messages
private void VerifMessages() {
_discussion.LireMessagesDestinataire();
//S'il y a un nouveau message on l'affiche
if (_discussion.NouveauMessage) {
_discussion.ConstruitListeComplete();
RemplirListView();
//Alerte nouveau message
if (chbxAlerte.Checked && this.ContainsFocus == false) {
FlashWindow(this.Handle, true); //Faire clignoter dans la barre des tâches
}
}
}
//Vérification de l'activité de la souris
private void VerifSouris() {
if (Cursor.Position == _dernierePositionSouris) { //Si on n'a pas changer de position
_nbTickSourisInactive++; //On augmente le compteur
if (_nbTickSourisInactive >= 120) { //Si ça fait plus de 2 min qu'on n'a pas bougé
if (_discussion.SourisActive == true) { //Si on était actif avant, on passe en mode inactif
_discussion.SourisActive = false;
_discussion.DefinirActiviteSouris();
}
}
}
else //Si on change de position
{
_nbTickSourisInactive = 0; //On réinitialise le compteur
_dernierePositionSouris = Cursor.Position; //On met à jour la dernière position
if (_discussion.SourisActive == false) { //Si on était inactif, on passe en mode actif
_discussion.SourisActive = true;
_discussion.DefinirActiviteSouris();
}
}
}
//Vérification de l'état du correspondant
private void VerifEtatAutre() {
if (_discussion.DerniereActiviteDestinataire < DateTime.Now.AddMinutes(-1)) { //Si ça fait plus d'une minute par rapport à la dernière heure entrée par l'utilisateur
lblCorrespondant.Text = "Correspondant non connecté";
lblCorrespondant.BackColor = Color.Red;
}
else {
if (_discussion.DestinataireActif) {
lblCorrespondant.Text = "Correspondant actif";
lblCorrespondant.BackColor = Color.Green;
}
else {
lblCorrespondant.Text = "Correspondant inactif";
lblCorrespondant.BackColor = Color.Orange;
}
}
}
}
} |
MainForm.Designer.cs
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
| namespace sebChat
{
partial class MainForm
{
/// <summary>
/// Designer variable used to keep track of non-visual components.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Disposes resources used by the form.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing) {
if (components != null) {
components.Dispose();
}
}
base.Dispose(disposing);
}
/// <summary>
/// This method is required for Windows Forms designer support.
/// Do not change the method contents inside the source code editor. The Forms designer might
/// not be able to load this method if it was changed manually.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
this.txtMessage = new System.Windows.Forms.TextBox();
this.btnSend = new System.Windows.Forms.Button();
this.dgHisto = new System.Windows.Forms.DataGridView();
this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.timerCheck = new System.Windows.Forms.Timer(this.components);
this.chbxAlerte = new System.Windows.Forms.CheckBox();
this.lblCorrespondant = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.dgHisto)).BeginInit();
this.SuspendLayout();
//
// txtMessage
//
this.txtMessage.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtMessage.Location = new System.Drawing.Point(7, 480);
this.txtMessage.Multiline = true;
this.txtMessage.Name = "txtMessage";
this.txtMessage.Size = new System.Drawing.Size(420, 90);
this.txtMessage.TabIndex = 1;
//
// btnSend
//
this.btnSend.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnSend.Location = new System.Drawing.Point(433, 481);
this.btnSend.Name = "btnSend";
this.btnSend.Size = new System.Drawing.Size(65, 50);
this.btnSend.TabIndex = 2;
this.btnSend.Text = "Envoyer";
this.btnSend.UseVisualStyleBackColor = true;
this.btnSend.Click += new System.EventHandler(this.BtnSendClick);
//
// dgHisto
//
this.dgHisto.AllowUserToAddRows = false;
this.dgHisto.AllowUserToDeleteRows = false;
this.dgHisto.AllowUserToResizeColumns = false;
this.dgHisto.AllowUserToResizeRows = false;
this.dgHisto.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.dgHisto.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
this.dgHisto.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.dgHisto.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;
this.dgHisto.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgHisto.ColumnHeadersVisible = false;
this.dgHisto.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.Column1,
this.Column2});
this.dgHisto.Location = new System.Drawing.Point(8, 35);
this.dgHisto.MultiSelect = false;
this.dgHisto.Name = "dgHisto";
this.dgHisto.ReadOnly = true;
this.dgHisto.RowHeadersVisible = false;
this.dgHisto.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.dgHisto.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dgHisto.Size = new System.Drawing.Size(489, 435);
this.dgHisto.TabIndex = 3;
this.dgHisto.SelectionChanged += new System.EventHandler(this.DgHistoSelectionChanged);
//
// Column1
//
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.Column1.DefaultCellStyle = dataGridViewCellStyle1;
this.Column1.FillWeight = 21.05372F;
this.Column1.HeaderText = "Column1";
this.Column1.MinimumWidth = 40;
this.Column1.Name = "Column1";
this.Column1.ReadOnly = true;
this.Column1.Resizable = System.Windows.Forms.DataGridViewTriState.False;
//
// Column2
//
dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.Column2.DefaultCellStyle = dataGridViewCellStyle2;
this.Column2.FillWeight = 82.63584F;
this.Column2.HeaderText = "Column2";
this.Column2.Name = "Column2";
this.Column2.ReadOnly = true;
this.Column2.Resizable = System.Windows.Forms.DataGridViewTriState.False;
//
// timerCheck
//
this.timerCheck.Interval = 1000;
this.timerCheck.Tick += new System.EventHandler(this.TimerCheckTick);
//
// chbxAlerte
//
this.chbxAlerte.Location = new System.Drawing.Point(12, 5);
this.chbxAlerte.Name = "chbxAlerte";
this.chbxAlerte.Size = new System.Drawing.Size(104, 24);
this.chbxAlerte.TabIndex = 4;
this.chbxAlerte.Text = "Alerte activée";
this.chbxAlerte.UseVisualStyleBackColor = true;
//
// lblCorrespondant
//
this.lblCorrespondant.Location = new System.Drawing.Point(133, 7);
this.lblCorrespondant.Name = "lblCorrespondant";
this.lblCorrespondant.Size = new System.Drawing.Size(237, 19);
this.lblCorrespondant.TabIndex = 5;
this.lblCorrespondant.Text = "Recherche d\'info sur correspondant";
this.lblCorrespondant.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// MainForm
//
this.AcceptButton = this.btnSend;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(510, 581);
this.Controls.Add(this.lblCorrespondant);
this.Controls.Add(this.chbxAlerte);
this.Controls.Add(this.dgHisto);
this.Controls.Add(this.btnSend);
this.Controls.Add(this.txtMessage);
this.Name = "MainForm";
this.Text = "Chat By Seb";
((System.ComponentModel.ISupportInitialize)(this.dgHisto)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
private System.Windows.Forms.Label lblCorrespondant;
private System.Windows.Forms.CheckBox chbxAlerte;
private System.Windows.Forms.Timer timerCheck;
private System.Windows.Forms.DataGridView dgHisto;
private System.Windows.Forms.DataGridViewTextBoxColumn Column2;
private System.Windows.Forms.DataGridViewTextBoxColumn Column1;
private System.Windows.Forms.Button btnSend;
private System.Windows.Forms.TextBox txtMessage;
}
} |
J'espère que ça pourra servir à quelqu'un et si vous avez des retours ou des remarques, n'hésitez pas !