CopyPaste
Transkrypt
CopyPaste
Leszek Stasiak Opis Programu CopyPaste Program podzielony jest na 4 części. - Interfejs użytkownika - Serwer - Klient - Obsługa gorących klawiszy (F2) Te trzy ostatnie części są oddzielnymi plikami dll. 1.Serwer Zacznijmy od serwera, który jest najważniejszym elementem programu. Aby móc stworzyć serwer tworzymy socket: static Socket sck; oraz metodę która uruchomi serwer: Kod C# public bool Run(int port) { try { sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sck.Bind(new IPEndPoint(0, port)); sck.Listen(10); UpdateStatus("--Uruchomiono serwer"); ListenStart(); return true; } catch { UpdateStatus("--Błąd! Nie można uruchomić serwera."); return false; } } Kawałek kodu odpowiada za uruchomienie serwera. Więcej informacji na temat socketów można znaleźć: http://csharp.net-informations.com/communications/csharp-socket-programming.htm oraz http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx Funkcja ListenStart() powoduje rozpoczęcie nasłuchiwania serwera. Wywołuje ona w drugi wątek, po to, aby nie obciążać głównego wątku programu. Kod C# private void ListenStart() { t = new Thread(new ThreadStart(Listen)); t.IsBackground = true; t.Start(); } Więcej temat wątków programu: http://www.yoda.arachsys.com/csharp/threads/winforms.shtml Jak poinformować użytkownika o stanie serwera, który działa w drugim wątku? Najłatwiej stworzyć wydarzenie: Np. public event Action StatusChange; Do tego celu musimy stworzyć zmienną status, która będzie przechowywać informację. Jeśli chcemy uaktualnić status dajemy: Kod C# private void UpdateStatus(string text) { status = text; StatusChange(); } W klasie głównej dodajemy : server.StatusChange += new Action(UpdateView); Gdzie UpdateView(jest funkcją która pobierze informację od serwera i wyświetli ją użytkownikowi). 2.Klient Program Kliencki jest bardzo prosty. Wystarczy podręcznikowo połączyć się z serwerem i przekazać mu tekst do czego służy funkcja : Kod C# public bool SendMessage(string text) { byte[] data = Encoding.UTF8.GetBytes(text); try { sck.Send(data); return true; } catch { return false; } } Teraz pozostaje tylko wywołanie tej funkcji. Otóż tym zajmie się hotkey. 3. Hotkeys Więcej o nich na stronie http://www.dreamincode.net/forums/topic/180436-global-hotkeys/ Hotkey wykorzystuje bibliotekę systemową user32.dll W programie wykorzystałem projekt załączony do artykułu zamieszczonego powyżej. W pliku głównym wystarczy dać na początku private GlobalHotkey ghk; oraz zarejestrować klawisz Kod C# ghk = new Hotkey.GlobalHotkey(Constants.NOMOD, Keys.F2, this); ghk.Register(); Na koniec pozostaje tylko dodać zdarzenie, które będzie wykonywane po wciśnięciu klawisza F2, nawet wtedy, gdy okno z programem będzie zminimalizowane. Kod C# protected override void WndProc(ref Message m) { //Wykonuje się po wciśnięciu kombinacji przycisków. if (m.Msg == Hotkey.Constants.WM_HOTKEY_MSG_ID) if(client.SendMessage(Clipboard.GetText())) Status("Wiadomość wysłano pomyślnie"); else Status("Błąd. Brak połączenia z serwerem"); base.WndProc(ref m); }