Archiwum: Komputery – oprogramowanie

Klikasz? No ba!

Kolejny prosty i przydatny programik, który można szybko napisać w C#. Celem jest symulowanie kliknięć myszką. Zakładając, że z jakiegoś powodu musimy wykonać kilkaset czy kilka tysięcy kliknięć może się okazać niezastąpiony.

Zacznijmy od koniecznej podstawy do dalszych działań. Poniżej znajduje się kompletny kod, który zapewni możliwość manipulacji myszką:

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace MultiClick
{
    public partial class Form1 : Form
    {
        // Ładujemy bibliotekę user32.dll
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

        // Będziemy korzystać z funkcji mouse_event z załadownej biblioteki
        public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
        
        // Będziemy potrzebować kody różnych zdarzeń związnych z myszką
        public enum MouseEventFlags
        {
            LEFTDOWN = 0x00000002,
            LEFTUP = 0x00000004,
            MIDDLEDOWN = 0x00000020,
            MIDDLEUP = 0x00000040,
            MOVE = 0x00000001,
            ABSOLUTE = 0x00008000,
            RIGHTDOWN = 0x00000008,
            RIGHTUP = 0x00000010
        }

        public Form1()
        {
            InitializeComponent();
        }
    }
}

Pierwszą rzeczą, której warto się nauczyć to odczytywanie pozycji kursora. Przyda się to do późniejszego celowania.

Potrzebujemy przycisk i dwa pola tekstowe. Poniższy kod wpisuje współrzędne kursora po kliknięciu przycisku. Oczywiście należy uaktywnić przycisk (np. przechodząc do niego tabulatorem) i wcisnąć spację w momencie, w którym chcemy spisać współrzędne kursora. Można to rozwiązać inaczej, ale ten przykład miał być prosty. Wracając do kodu:

        private void button1_Click(object sender, EventArgs e)
        {
            int X = Cursor.Position.X;
            int Y = Cursor.Position.Y;
            textBox1.Text = X.ToString();
            textBox2.Text = Y.ToString();
        }

Jak już wiemy gdzie chcemy działać myszką – do dzieła. Czas zacząć klikać. Napisałem sobie dwie funkcje.

Za kliknięcie lewym klawiszem odpowiada funkcja LeftClick, która przyjmuje jako argumenty współrzędne punktu.

        public static void LeftClick(int x, int y)
        {
            // Ustawiamy kursor w punkcie x, y
            Cursor.Position = new System.Drawing.Point(x, y);
            // Symulujemy wcisnięcie lewego przycisku myszy
            mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
            // Symulujemy puszczenie lewego przycisku myszy
            mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
        }

Za przeciągnięcie elementu odpowiada funkcja LeftDrag, która przyjmuje jako argumenty współrzędne dwóch punktów.

        public static void LeftDrag(int x, int y, int x2, int y2)
        {
            Cursor.Position = new System.Drawing.Point(x, y);
            mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
            Cursor.Position = new System.Drawing.Point(x2, y2);
            mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
        }

Teraz wystarczy skleić powyższe kawałki kodu i napisać program (kod), który będzie klikał. Ja dla przykładu utworzyłem przycisk, którego kliknięcie spowoduje narysowanie “rysunku” w paincie:

Kod potrzebny do wygenerowania rysunku wygląda następująco:

        private void button2_Click(object sender, EventArgs e)
        {
            LeftDrag(300, 300, 300, 480);
            LeftDrag(300, 480, 480, 480);
            LeftDrag(480, 480, 480, 300);
            LeftDrag(480, 300, 300, 300);
            for (int x = 0; x < 18; x++)
            {
                for (int y = 0; y < 18; y++)
                {
                    LeftClick(300 + y * 10, 300 + x * 10);
                }
            }
        }

I to tyle. Dalsze wariacje w temacie zostawiam czytelnikom.

| Komentarze (3)

Zrzut (ekranu) strony www o dowolnym rozmiarze (C#)

Mały i prosty kawałek przydatnego kodu w C# .net – może komuś się przyda. Za pomocą opisanego poniżej programu można zapisać zrzut dowolnej strony internetowej do pliku graficznego. Nie byłoby w tym nic nadzwyczajnego gdyby nie fakt, że program potrafi wygenerować zrzut o rozmiarze większym niż ekran – bez sztucznego przewijania strony.

Przykładowy zrzut tego bloga o rozmiarze 800 na 19560 pikseli można zobaczyć w pomniejszeniu (oryginał ma ponad 5 mega) tutaj.

Jak to działa? Kontrolka przeglądarki (czyli nasze “okno”) tworzona jest w tle, dzięki czemu może mieć dowolny rozmiar, wykraczający poza granice ekranu.

Jak wygląda aplikacja? Moja wygląda bardzo prosto, ponieważ zawiera wyłącznie minimum funkcji i możliwości. Pozwala na wybranie adresu strony, nazwy pliku do którego zapisujemy zrzut i rozmiaru zrzutu.

Przy tworzeniu programu potrzebujemy kontrolki webBrowser, którą należy umieścić na formie, ale poza widocznym obszarem. Dodatkowo wykorzystałem 3 pola tekstowe i guzik.

Kod programu z drobnym komentarzem jest następujący.

// Przepisujemy wartości z GUI do zmiennych:   
	int width = Int32.Parse(textBox2.Text);
	int height = Int32.Parse(textBox3.Text);
	string url = textBox1.Text;
	string file = textBox4.Text;

// Konfigurujemy kontrolkę webBrowser
	webBrowser1.ScrollBarsEnabled = false;
	webBrowser1.Width = width;
	webBrowser1.Height = height;

// Rozpoczynamy pobieranie strony (URL):
	webBrowser1.Navigate(url);

// Czekamy, aż pobieranie się zakończy:
	while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
	{
		Application.DoEvents();
	}

// Tworzymy zmienną na zrzut o odpowiednim rozmiarze:
	Bitmap bitmap = new Bitmap(width, height);
	Rectangle bitmapRect = new Rectangle(0, 0, width, height);

// Zapisujemy zrzut strony do utworzonej zmiennej
	webBrowser1.DrawToBitmap(bitmap, bitmapRect);

// Konwertujemy zminną bitmapową do obrazka i zapisujemy w formacie PNG
	System.Drawing.Image origImage = bitmap;
	origImage.Save(file, ImageFormat.Png);;

Może się kiedyś komuś przyda. Zakładam, że mi się kiedyś przyda, więc napisałem ten wpis, żeby mi się rozwiązanie nie zgubiło.

| Komentarze (1)

Skąd Google wie gdzie jest moje WiFi?

Google MapsDla nadania kontekstu przypomnę, że od ponad pół roku korzystam z telefonu komórkowego BlackBerry Bold. Jednym z atutów tego systemu jest fakt, że jest bardzo popularny w USA, dzięki czemu liczący się na rynku gracze pamiętają o tworzeniu swoich aplikacji również w wersji na BB. Mowa głównie o Google, które zapewnia pełną współpracę pomiędzy terminalem a usługami Google. Nie jest inaczej w przypadku aplikacji Google Maps, która bardzo dobrze współpracuje z wbudowanym w urządzenie GPS-em i systemem A-GPS. W aplikacji tej zintegrowana jest usługa Google Latitude, która w Polsce jest jeszcze mało znana.

Google LatitudeGoogle Latitude przesyła informacje o naszym położeniu na serwer i umożliwia udostępnianie tej wiadomości znajomym (a bezpośrednio w programie widzimy na mapie swoich znajomych). Możemy udostępnić taką informację w swoim opisie w Google Talk (status automatycznie się uaktualnia) albo umieścić na mapie na swojej stronie. Dodatkowo Google może pamiętać nasze położenie, dzięki czemu możemy zobaczyć na mapie historię miejsc pobytu i wyeksportować do Google Earth.

Google Latitude History

Aby nie powodować nadmiernego zużycia baterii aplikacja nie używa GPS gdy jest uruchomiona w tle, tylko korzysta z A-GPS, czyli aproksymuje lokalizację na podstawie informacji o “widzianych” przez telefon nadajnikach GSM. Zwykle dokładność takiego określenia pozycji wynosi od kilkuset metrów do kliku kilometrów. Im więcej nadajników (miasto) tym informacja dokładniejsza.

Przechodząc do sedna sprawy: uruchomiłem wczoraj aplikację u siebie na wsi. Google Maps pokazało kropkę na mapie w prawie idealnym miejscu (+- 20 metrów) i napisało “Your location within 100 meters. Waiting for GPS”. Bez sygnałów z satelitów udało mu się określić “dokładną” pozycję. Krótki test pokazał, że stało się tak dzięki temu, że telefon był w tym czasie podłączony do prywatnego, domowego WiFi (stąd pewnie dokładność 100 metrów odpowiadająca zasięgowi WiFi). Pomyślałem, że dziwne i stwierdziłem że nie będę zawracał sobie tym głowy.  Przyjechałem do Warszawy i powtórzyłem test. Bez WiFi lokalizacja jest z dokładnością rzędu 1000 metrów. Włączyłem WiFi i od razu osiągnąłem dokładność 100 metrów (bez GPS!), a kropka oznaczająca pozycję jest na mapie umieszczona w idealnym miejscu.  I teraz pytanie: Skąd Google wie gdzie jest moje WiFi? Przyznam, że nie umiem udzielić odpowiedzi na to pytanie. Jestem świadomy, że Google wie o nas wszystkich dużo, ale czy czasami nie za dużo? Skąd oni biorą informacje (oba WiFi podłączone do neostrady w dwóch różnych województwach)?

Może ktoś umie udzielić odpowiedzi na to pytanie? Jeśli ktoś posiada Google Maps, niech spróbuje czy ma taki sam objaw.

Wykonałem “za ciosem” jeszcze jedną próbę: odpaliłem na iPod Touch podłączonym do WiFi Google Maps, ale program stwierdził, że nie potrafi znaleźć mojej lokalizacji.

Zapraszam do podzielenia się własnymi uwagami na ten temat.

| Komentarze (41)

Oferta pracy – Programista Web

W związku z rozwojem firmy iStudio, której jestem współwłaścicielem poszukujemy chętnego do współpracy programisty aplikacji internetowych.

Logo iStudio

Opis stanowiska

Do zadań osoby na tym stanowisku należeć będzie implementacja i testowanie aplikacji, a następnie ich uruchomienie w środowisku produkcyjnym. Programista Web powinien spodziewać się bezpośredniego kontaktu z klientami i projektantami grafiki przy realizacji ciekawych projektów dla małych i średnich firm. Oferujemy atrakcyjne wynagrodzenie, elastyczny czas pracy oraz możliwość pracy zdalnej.

Wymagane umiejętności

  • Biegła znajomość PHP
  • Biegła znajomość SQL
  • Znajomość technologii internetowych:
    • XHTML
    • CSS
    • Ajax
  • Znajomość języka angielskiego

Preferowane umiejętności

  • Znajomość programów graficznych
  • Doświadczenie w pracy z:
    • WordPress
    • Joomla
    • Drupal
    • CakePHP
    • OsCommerce

Szczegóły w pliku PDF: Oferta pracy, Programista Web

| Komentarze

Gmail – rewelacyjna funkcja o kiepskiej nazwie

Gmail Logo

Dzisiaj odkryłem dwie rewelacyjne funkcje Gmaila, które postanowiłem dla porządku opisać w oddzielnych wpisach. Pierwszą jak widać we wcześniejszym wpisie było umożliwienie wysyłana z dodatkowych kont przez IMAP. Druga dotyczy dodatku dostępnego w ramach Laboratorium o nazwie “Odpowiedzi bazujące na szablonach“. Dziś okazało się, że jest to dokładnie funkcja której od dawna szukałem, która została zwyczajnie źle nazwana.

Po pierwsze jej działanie nie dotyczy wyłącznie odpowiednia, a wszystkich edycji wiadomości wraz z tworzeniem nowej. Po drugie ma niewiele wspólnego z szablonami. Uruchomienie funkcji powoduje dodanie dodatkowego menu w oknie edycji wiadomości:

Google Gmail Odpowiedzi bazujące na szablonach

Za pomocą tego menu możemy zdefiniować dowolnie dużo gotowych treści (może być to cały mail, jedno zdanie, podpis – cokolwiek), które później możemy również za pomocą menu umieszczać w czasie edycji wiadomości. Treść jest wstawiana w miejscu, gdzie znajduje się kursor, co jest bardzo wygodne. Wiemy co chcemy osiągnąć, więc po kolei jak to zrobić

Po pierwsze potrzebujemy zdefiniować swoje gotowe treści. Tworzymy w tym celu pustą, nową wiadomość i w jej treści wpisujemy wyłącznie tekst, który chcemy zapisać na przyszłość. Klikamy w nowe menu i wybieramy “nowa odpowiedź bazująca na szablonie”:

Nowa odpowiedź bazująca na szablonie

Pojawi się okienko, w którym należy wpisać nazwę nowego “szablonu”. Po utworzeniu potrzebnego zestawu tekstów możemy ich swobodnie używać. Podczas edycji ustawiamy kursor w wybranym miejscu i z menu wybieramy, który tekst chcemy wstawić. Do jednej wiadomości można wstawić kilka tekstów.

Możemy zapisać szablon z formatowaniem. Należy tylko pamiętać, aby użyć go gdy w wiadomości mamy włączone formatowanie.

Funkcja jest bardzo potrzebna. Wymaga rozwoju (dla tego należy do Laboratorium). Menu mogłoby być bardziej intuicyjne. No i najważniejsze: nazwy – to nie są szablony. Tak czy inaczej – kolejne dzisiaj brawa dla Google!

| Komentarze (1)

Gmail – wreszcie wysyła przez SMTP

Gmail Logo

24 lutego napisałem na moronach artykuł o moich 5 życzeniach dotyczących Gmail (5 wishes about Gmail). Wielka była moja radość, gdy dzisiaj odkryłem, że pierwsze i najważniejsze życzenie zostało spełnione. Już mówię o co chodziło. Do tej pory mieliśmy możliwość skonfigurowania wielu kont pocztowych (do 5), z których Gmail okresowo pobierał pocztę. Przy każdym z tak skonfigurowanych kont mogliśmy zaznaczyć, że chcemy również z danego konta wysyłać pocztę za pomocą interfejsu Gmail. Problem polegał na tym, że wiadomości wysyłane przez dodatkowe konta trafiały do adresatów rzeczywiście z dobrego adresu e-mail, ale z dodatkową adnotacją (widoczną w niektórych klientach pocztowych). Pole “od” zamiast adresu zawierało notkę: “konto …@gmail.com w imieniu Imię Nazwisko [adres@domena]“. Niby działało, ale do kontaktów biznesowych z klientami jakoś nie pasowało.

Dzisiaj dodawałem nowe konto do swojego głównego konta Gmail i odkryłem pojawienie się przy konfiguracji nowej opcji:

Konfiguracja konta w Gmail

Zaznaczając “Wyślij poprzez serwery SMTP” i poprawnie konfigurując dane serwera zyskujemy możliwość wysyłanie przez interfejs Gmail pełnoprawnych wiadomości poprzez dodatkowe konta. Rewelacja. Dziękuję ci Google!

Aby zmienić konfigurację do konta, które już jest ustawione w Gmail, należy wejść w ustawienia, przejść na zakładkę “konta i importowanie”, a następnie w sekcji “Wyślij pocztę jako” wybrać “edytuj informacje” przy danym koncie.

| Komentarze

Google Wave – pierwsza prezentacja możliwości

Dzisiaj chciałbym pokazać ogólnie zasadę działania i interfejs Wave. Robienie tego za pomocą screenów nie miałoby sensu, więc zrobiłem 10 minutowy film, którym staram się zachęcić do Wave. Nie ma w nim co prawda nic odkrywczego, ale warto zobaczyć chociażby dla zapoznania się z działaniem robotów w Wave.

Google Wave

Najlepiej kliknąć w film, gdyż jest on dostępny w wersji HD, na której widać wszystkie szczegóły.

| Komentarze

30 września – ważna data dla Google Wave

Na blogu Google pojawił się dzisiaj film ze spotkania developerów Wave z końca lipca. Podczas spotkania pojawia się wypowiedź Larsa Rasmussena, w której przedstawia plan na najbliższą przyszłość dotyczącą Google Wave.

Google Wave

Magiczną datą będzie 30 września, kiedy to aplikacja zostanie przeniesiona z developerskiego adresu (http://wavesandbox.com/) na docelowy http://wave.google.com. Samo przeniesienie ma być przy tym oznaczeniem rozwoju platformy z fazy alpha do beta. Nie będzie to jednak jeszcze publiczna beta. W tej chwili dostęp do Wave ma kilkanaście tysięcy osób. Od 30 września Google planuje rozszerzyć tę pulę do 100 000 osób.

Lars Rasmussen wymienia trzy ważne kroki, które zostaną poczynione w ramach przechodzenia do wersji beta:

  1. Prędkość. W tej chwili rzeczywiście Wave pracuje powoli. Wynika to z faktu, że do tej pory nie optymalizowano kodu pod tym kątem.
  2. Niezawodność. W tej chwili podczas zwykłego użytkowania zdążają się błędy i restart interfejsu.
  3. Usability (sorry, ale nie ma sensownego odpowiednika po polsku). W tej chwili pewne funkcje interfejsu są nieintuicyjne, albo ich działania mocno odbiega od oczekiwanego.

Nie wiadomo kiedy planowane jest otwarte udostępnienia Wave. Nie wiadomo również na jakiej zasadzie się to odbędzie: być może zostanie wykorzystany system z wczesnego Gmail – zaproszenia. Nie ma się co dziwić Googlowi, że nie chcą mówić otwarcie o datach. Jak ognia chcą unikać błędów powszechnie popełnianych przez inne firmy, które zapowiadają premierę nowego produktu, a następnie przekładają ją miesiącami a czasem i latami w przód.

| Komentarze

Google Wave – sukces zagrożony?

Jak napisałem rano dostałem dostęp do oczekiwanej usługi Google Wave w wersji dla developerów. Pobawiłem się trochę całym tym systemem i nabrałem przekonania, że “zabawa” to dobre słowo do opisu tego narzędzia. Zacząłem wątpić w rzeczywisty sens korzystania z niego. Nie chodzi mi oczywiście tutaj o fakt, iż wersja z które korzystam ma dużo błędów, i nie zawsze działa tak jak tego oczekuję.

Google w swojej cudownej prezentacji z maja wyjaśniał skąd wziął się pomysł ma Wave. Powiedzieli bardzo mądrą rzecz: żeby zrobić coś nowego i innowacyjnego trzeba na chwilę zapomnieć o tym co już osiągnęliśmy, żeby nas nie ograniczało. Wave miał być platformą (i protokołem) komunikacyjnym nowocześniejszym niż e-mail czy komunikatory. Jest nowocześniejszy – ale to nie wystarczy. Wydaje mi się, że o e-mail zapomnieli sobie na koniec przypomnieć.

Google Wave

Wave okazuje się być systemem bardzo autonomicznym – nie jest kompatybilny z tym co do tej pory znamy (ktoś zaraz powie, że przecież jest to otwarta platforma i można napisać roboty – konektory. Można, ale to nie o to chodzi.). Już tłumaczę, gdzie widzę problem. Mimo rozwoju sieci przez wiele lat e-mail jest jedynym nośnikiem za pomocą którego można skomunikować dwóch dowolnych użytkowników. Z komunikatorów korzysta wielu internautów, ale z różnych (oczywiście nasi znajomi korzystają z tego co my itd). Moja wizja Wave była szersza – następca e-mail. Niestety nie ma tutaj nawet kompatybilności. Wave działa tylko pomiędzy użytkownikami posiadającymi konto w Wave. Do konta developerskiego, które dostałem przypisane jest zwykłe (no prawie – różnica polega na tym że ma 25 GB pojemności) konto gmail do obsługi poczty. Jeżeli Google nie będzie w stanie dokonać integracji Wave z tradycyjnym e-mail – usługa ta nie będzie przełomowa – a na taką była kreowana.

Współpraca wewnątrz grupy posiadającej Wave zdaje się być cudowna (chociaż już przy 2 osobach czasami staje się chaotyczna), ale nie wiem czy to za mało. Dużo z pokazanych na prezentacji zastosowań to gadżety i zabawki. Obawiam się, że Wave skończy jako kolejny komunikator (warto zauważyć, że wyłącznie tekstowo – graficzny). I tu znów jest problem – technologiczne zaawansowanie powoduje, że Wave jest trudny do implementacji dla urządzeń przenośnych. A w dzisiejszych czasach trend jest zdecydowanie ku mobilności. Spróbowałem uruchomić Wave w przeglądarce w iPod Touch (czyli w iPhonie) i swoim BlackBerry – w obydwu przypadkach fiasko (a iPod wymagał resetu).

Być może przesadzam i się mylę. Do dzisiaj wierzyłem w przełom. Od dzisiaj mam wątpliwości.

Warto przy okazji zauważyć, że udostępniana dziś wersja nie różni się (przynajmniej na tyle na ile mogę porównać) od tej z prezentacji. Brakuje tych samych funkcji. Nie ma nic nowego.

| Komentarze

Google Wave – pierwszy kontakt!

Pierwsza wiadomość o projekcie Google pod nazwą Wave dotarła do mnie 28 maja 2009, czyli już dłuższy czas temu. Była to ponad godzinna prezentacja nowacyjnego systemu komunikacji w sieci. Tych, którzy do tej pory nie słyszeli o Wave gorąco zachęcam do poświęcenia 80 minut na zapoznanie się z prezentacją Google.

Google Wave

Od tamtej pory trwało oczekiwanie: kiedy będę mógł się do tego systemu dorwać osobiście i przetestować czy to rzeczywiście działa. Oficjalna premiera publicznej bety planowana jest na jesień tego roku (czyli już niedługo – u mnie powoli zaczynają spadać liście). Google przygotował jednak możliwość wcześniejszych testów. Należało się zarejestrować na specjalnej stronie (tłumacząc bezpośrednio: “poprosić o dostęp do piaskownicy Wave”) i czekać na reakcje Google. Zarejestrowałem się na początku czerwca i drugi raz w połowie lipca (na inne konto, żeby spróbować szczęścia jeszcze raz). Dziś w nocy dostałem informacje, że moja prośba została pozytywnie rozpatrzona i mogę zakładać konto: WYPAS!

Zakładając dwa konta otrzymałem w rzeczywistości 4 (konta są podwójne, dzięki czemu można samemu testować swoje rozwiązania).

Muszę przyznać, że na pierwszy rzut oka okazało się, że system nie jest jeszcze tak genialny jak się spodziewałem. Ma sporo niedoróbek, a opanowanie jego obsługi zajmuje trochę czasu. Można to wszystko zrozumieć – przecież to wersja developer preview.

Google Wave

Więcej o systemie, jego zaletach i wadach wieczorem – muszę się trochę pobawić 🙂

| Komentarze (3)

Starsze wpisy »