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);
}