private void HandleMessage(Message.MESSAGE_ID msgType, byte[] msgData)
        {
            switch (msgType)
            {
            case Message.MESSAGE_ID.BUTTON:
                Debug.WriteLine(string.Format("BTN " + BitConverter.ToInt32(msgData, 0)));
                Win32Natives.keybd_event((byte)BitConverter.ToInt32(msgData, 0), 0, (int)Win32Natives.KeyActionState.Down, 0);
                Win32Natives.keybd_event((byte)BitConverter.ToInt32(msgData, 0), 0, (int)Win32Natives.KeyActionState.Up, 0);
                _socket.SendBytes(Message.Create(Message.MESSAGE_ID.OK, 0));
                break;

            case Message.MESSAGE_ID.MOUSE:
                int x = BitConverter.ToInt32(msgData, 0);
                int y = BitConverter.ToInt32(msgData, 4);
                break;

            case Message.MESSAGE_ID.NONE:
                break;

            case Message.MESSAGE_ID.GET_STATUS:
                break;

            case Message.MESSAGE_ID.STATUS:
                break;

            case Message.MESSAGE_ID.GET_SCREEN:
                lock (ObjScreenLock)
                {
                    try
                    {
                        Bitmap bmpScreem = (Bitmap)ScreenCapture.CaptureDesktop();                                // NativeMethods.CaptureScreen(new Rectangle(0, 0, 272, 480));
                        SendScreenBitmap(BitmapToByteArray(bmpScreem));

                        //bmpScreem.Save(BMP_FILENAME, ImageFormat.Jpeg);
                        //// send screen bitmap
                        //SendScreenBitmap(BMP_FILENAME);
                    }
                    catch (Exception exception)
                    {
                        _socket.SendBytes(Message.Create(Message.MESSAGE_ID.NONE, 0));
                        _logger.Log(string.Format("HandleMessage {0} {1}", msgType, exception));
                    }
                }
                break;

            case Message.MESSAGE_ID.SCREEN:
                break;
            }
        }
        public void HandleConnection(object obj)
        {
            if (_socket != null)
            {
                try
                {
                    while (_socket.IsConnected())
                    {
                        // read header first
                        byte[]           headerBytes      = new byte[Message.MSG_HEADER_LENGTH];
                        ReadMessageToken readMessageToken = new ReadMessageToken
                        {
                            Buffer = headerBytes,
                            Event  = new AutoResetEvent(false),
                            Socket = _socket
                        };
                        IAsyncResult result = _socket.BeginReceive(headerBytes, 0, headerBytes.Length, SocketFlags.None,
                                                                   CallbackReadHeader, readMessageToken);

                        result.AsyncWaitHandle.WaitOne();
                        readMessageToken.Event.WaitOne();

                        if (readMessageToken.Buffer != null)
                        {
                            Message.MESSAGE_ID msgType = Message.GetMessageType(readMessageToken.Buffer);
                            int msgLength = Message.GetMessageLength(readMessageToken.Buffer);
                            if (msgLength > 0)
                            {
                                byte[] msgData = new byte[msgLength];
                                ReadCompleteMessage(msgData);
                                HandleMessage(msgType, msgData);
                            }
                            else
                            {
                                HandleMessage(msgType, null);
                            }
                        }
                    }
                }
                catch (Exception exception)
                {
                    _logger.Log("HandleConnection- " + exception);
                }
                finally
                {
                    _socket.DoClose();
                }
            }
        }