title: Client Server Winform IPC and stuff
body: <p>Sorry for the not so descriptive or apt title but I have been trying to do this for a while now but to no effect and its getting to me. I have a chat server(console application) and a chat client (winform application) (reference : <a href="http://csharp.net-informations.com/communications/csharp-chat-server-programming.htm" rel="nofollow">http://csharp.net-informations.com/communications/csharp-chat-server-programming.htm</a> )and a separate winform application which only has a button on it. Whenever there is any new message and if the client window  is minimized then i want that the button on that separate winform turns red. Once the client window gets restored or maximized then it should turn back to yellow which is also the original color of the button. I am able to achieve the change of color when a message is received but not taking into consideration the minimized state etc. If i try to do that using IsIconic nothing happens. What i have done is that get a handle of the client winform in the server application and checking if it is Iconic or not. Please guide as i am stuck on this for a while. The code is as follows:</p>
  
  <p>The Server Application:</p>
  
  <pre><code>using System;
  using System.Threading;
  using System.Net.Sockets;
  using System.Text;
  using System.Collections;
  using System.Net;
  using System.Runtime.InteropServices;
  using System.Drawing;
  using System.Diagnostics;
  
  
  namespace ConsoleApplication1
  {
  
      class Program
      {
  
          public static Hashtable clientsList = new Hashtable();
  
          public static void Main()
          {
              string mutex_id = "MY_APP";
              using (Mutex mutex = new Mutex(false, mutex_id))
              {
                  if (!mutex.WaitOne(0, false))
                  {
                      return;
                  }
  
                  var loaclAddress = IPAddress.Parse("127.0.0.1");
                  var serverSocket = new TcpListener(loaclAddress, 81);
                  /*
                  TcpListener serverSocket = new TcpListener(8888);
  
                  */
  
                  TcpClient clientSocket = default(TcpClient);
                  int counter = 0;
                  serverSocket.Start();
                  Console.WriteLine("Chat Server Started ....");
                  counter = 0;
  
                  while ((true))
                  {
                      counter += 1;
                      clientSocket = serverSocket.AcceptTcpClient();
                      byte[] bytesFrom = new byte[10025];
                      string dataFromClient = null;
                      NetworkStream networkStream = clientSocket.GetStream();
                      networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                      dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                      dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                      clientsList.Add(dataFromClient, clientSocket);
                      broadcast(dataFromClient + " Joined ", dataFromClient, false);
                      Console.WriteLine(dataFromClient + " Joined chat room ");
                      handleClinet client = new handleClinet();
                      client.startClient(clientSocket, dataFromClient, clientsList);
                  }
                  clientSocket.Close();
                  serverSocket.Stop();
                  Console.WriteLine("exit");
                  Console.ReadLine();
  
              }
  
          }
  
          public static void broadcast(string msg, string uName, bool flag)
          {
  
              foreach (DictionaryEntry Item in clientsList)
              {
  
                  TcpClient broadcastSocket;
                  broadcastSocket = (TcpClient)Item.Value;
                  NetworkStream broadcastStream = broadcastSocket.GetStream();
                  Byte[] broadcastBytes = null;
                  if (flag == true)
                  {
                      broadcastBytes = Encoding.ASCII.GetBytes(uName + " says : " + msg);
                  }
                  else
                  {
                      broadcastBytes = Encoding.ASCII.GetBytes(msg);
                  }
                  broadcastStream.Write(broadcastBytes, 0, broadcastBytes.Length);
                  broadcastStream.Flush();
              }
  
          }  //end broadcast function
  
      }//end Main class
  
  
  
  
  
      public class handleClinet
      {
  
          //This is used to send custom message to your Winforms
          [DllImport("user32")]
          private static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam);
          //This is used to find your winforms window
          [DllImport("user32", CharSet = CharSet.Auto)]
          private static extern IntPtr FindWindow(string className, string windowName);
          //This is used to register custom message so that it's ensured to be unique
          [DllImport("user32")]
          private static extern int RegisterWindowMessage(string msgName);
          [DllImport("user32.dll")]
          [return: MarshalAs(UnmanagedType.Bool)]
          static extern bool IsIconic(IntPtr hWnd);
  
  
          TcpClient clientSocket;
          string clNo;
          Hashtable clientsList;
  
          public void startClient(TcpClient inClientSocket, string clineNo, Hashtable cList)
          {
  
              this.clientSocket = inClientSocket;
              this.clNo = clineNo;
              this.clientsList = cList;
              Thread ctThread = new Thread(doChat);
              ctThread.Start();
          }
  
          private void doChat()
          {
  
              int requestCount = 0;
              byte[] bytesFrom = new byte[10025];
              string dataFromClient = null;
              Byte[] sendBytes = null;
              string serverResponse = null;
              string rCount = null;
              requestCount = 0;
  
              while ((true))
              {
                  try
                  {
                      requestCount = requestCount + 1;
                      NetworkStream networkStream = clientSocket.GetStream();
                      networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
                      dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                      dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
                      Console.WriteLine("From client - " + clNo + " : " + dataFromClient);
  
                      int msg = 0;
                      IntPtr hwnd = IntPtr.Zero;
                      int red = RegisterColorCode(Color.Red);
                      //Console.WriteLine(red);
                      int yellow = RegisterColorCode(Color.Yellow);
                      //Console.WriteLine(yellow);
                      msg = 49806;
                      if (hwnd == IntPtr.Zero)
                          hwnd = FindWindow(null, "Winforms Application");
                      IntPtr hwnd1 = FindWindow(null, "ClientApp");
  
                      if (IsIconic(hwnd1)) //this if-else seems to have no effect as no color changes in the button on the winform
                      {
                          if (hwnd != IntPtr.Zero)
                              SetBackColor(hwnd, msg);
                      }
                      else
                      {
                          msg = 50054;
                          SetBackColor(hwnd, msg);
                      }
  
                      //SetBackColor(hwnd, msg); 
                      //If i write only this then color changes but not on minized state its changed once and for all...
                      //what i want is for the previous if else condition to work**
  
                      hwnd1 = IntPtr.Zero;
  
  
                      rCount = Convert.ToString(requestCount);
                      Program.broadcast(dataFromClient, clNo, true);
  
                      hwnd = IntPtr.Zero;
                  }
                  catch (Exception ex)
                  {
  
                      Console.WriteLine(ex.ToString());
  
                  }
  
              }//end while
  
          }//end doChat
  
          static int RegisterColorCode(Color c)
          {
              return RegisterWindowMessage(c.ToString());
          }
  
  
          static void SetBackColor(IntPtr hwnd, int colorCode)
          {
              SendMessage(hwnd, colorCode, IntPtr.Zero, IntPtr.Zero);
          }
  
  
      } //end class handleClinet
  
  }//end namespace
  </code></pre>
  
  <p>The Client Application</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Data;
  using System.Drawing;
  using System.Linq;
  using System.Text;
  using System.Windows.Forms;
  using System.Net;
  using System.Net.Sockets;
  using System.Threading;
  using System.IO;
  using System.Runtime.InteropServices;
  
  namespace chatClient
  {
      public partial class Form1 : Form
      {
  
          TcpClient clientSocket = new System.Net.Sockets.TcpClient();
          NetworkStream serverStream;//new NetworkStream(clientSocket); //default(NetworkStream);
          string readData = null;
  
          public Form1()
          {
              InitializeComponent();
              Text = "ClientApp";
          }
  
          private void Form1_Load(object sender, EventArgs e)
          {
  
          }
  
  
          private void button1_Click(object sender, EventArgs e)
          {
  
              byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox2.Text + "$");
              serverStream.Write(outStream, 0, outStream.Length);
              serverStream.Flush();
          }
  
          private void button2_Click(object sender, EventArgs e)
          {
              readData = "Conected to Chat Server ...";
              msg();
              clientSocket.Connect("127.0.0.1", 81);
              serverStream = clientSocket.GetStream();
  
              byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBox3.Text + "$");
              serverStream.Write(outStream, 0, outStream.Length);
              serverStream.Flush();
  
              Thread ctThread = new Thread(getMessage);
              ctThread.Start();
  
              button2.Enabled = false;
          }
  
          private void getMessage()
          {
              while (true)
              {
                  serverStream = clientSocket.GetStream();
                  int buffSize = 0;
                  byte[] inStream = new byte[10025];
                  buffSize = clientSocket.ReceiveBufferSize;
                  serverStream.Read(inStream, 0, buffSize);
                  string returndata = System.Text.Encoding.ASCII.GetString(inStream);
                  readData = "" + returndata;
                  msg();
              }
          }
  
          private void msg()
          {
              if (this.InvokeRequired)
                  this.Invoke(new MethodInvoker(msg));
              else
                  textBox1.Text = textBox1.Text + Environment.NewLine + " &gt;&gt; " + readData;
          }
  
          private void textBox2_TextChanged(object sender, EventArgs e)
          {
  
          } 
  
      }
  }
  </code></pre>
  
  <p>The Winform Apllication which has the button on it:</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Data;
  using System.Drawing;
  using System.Linq;
  using System.Text;
  using System.Windows.Forms;
  using System.Diagnostics;
  using System.Runtime.InteropServices;
  
  
  namespace consoleMR
  {
      public partial class Form1 : Form
      {
          [DllImport("user32")]
          private static extern int RegisterWindowMessage(string msgName);
  
          int red, yellow;
  
          public Form1()
          {
              InitializeComponent();
  
              red = RegisterColorCode(Color.Red);
              yellow = RegisterColorCode(Color.Yellow);
              //Set your form caption to a specified (must be unique at the time it runs)
              Text = "Winforms Application";
          }
  
          private int RegisterColorCode(Color c)
          {
              return RegisterWindowMessage(c.ToString());
          }
  
          private const int WM_SYSCOMMAND = 0x0112;
          private const int SC_MINIMIZE = 0xf020;
          private const int SC_MAXIMIZE = 0xf030;
          private const int SC_RESTORE = 0xF120;
  
  
  
          protected override void WndProc(ref Message m)
          {
  
              if (m.Msg == WM_SYSCOMMAND)
              {
                  if (m.WParam.ToInt32() == SC_MAXIMIZE || m.WParam.ToInt32() == SC_RESTORE)
                  {
  
                      button1.BackColor = Color.Yellow;
                      this.WindowState = FormWindowState.Maximized;
                      return;
                  }
              }
              switch (m.Msg)
              {
                  case 49806:
                      button1.BackColor = Color.Red;
                      return;
                  case 570445:
                      button1.BackColor = Color.Yellow;
                      return;
              }
              base.WndProc(ref m);
          }
  
          private void buttonUCT_Click(object sender, EventArgs e)
          {
              Process.Start("C:\\Users\\MainUser\\Documents\\Visual Studio 2010\\Projects\\chatServer\\chatServer\\bin\\Debug\\chatServer.exe");
          }
  
      }
  }
  </code></pre>
  
  <p>I have been stuck on this for a while now and would really appreciate any help or sample code or correction of code...really anything at all</p>