AutoIt/Wyskakujące okna - prosta interakcja ze skryptem

Z Wikibooks, biblioteki wolnych podręczników.

Interfejs użytkownika[edytuj]

Człowiek nie jest zdolny do bezpośredniej komunikacji z komputerem. Aby była możliwość wymiany informacji między użytkownikiem, a programem niezbędne są elementy pośredniczące zwane interfejsem użytkownika. Interfejs ten składa się z części sprzętowej (np. monitor, klawiatura, mysz, drukarka itp.), jak i programowej (zwykle są to procedury systemu operacyjnego odpowiedzialne za odczyt urządzeń wskazujących, jak i wyświetlanie obrazu na ekranie monitora).

W programowaniu jako interfejs użytkownika rozpatruje się część oprogramowania zajmującą się obsługą urządzeń wejścia/wyjścia przeznaczonych dla interakcji z użytkownikiem.


Rodzaje interfejsu użytkownika[edytuj]

Interfejs tekstowy — urządzenie wejściowe to klawiatura, a wyjściowe wyświetlacz w trybie znakowym. Ten typ interfejsu realizowany jest w AutoIt za pomocą tzw. konsoli tekstowej.

Interfejs graficzny — wejście to urządzenie wskazujące (np. myszka), a wyjściowe to wyświetlacz w trybie graficznym. Interfejs graficzny tworzony jest z użyciem:

- wyskakujących okienek (z ang. popup)

- GUI (ang. Graphical User Interface) opartym na kontrolkach systemu operacyjnego Windows


Wymienione powyżej sposoby nie wykluczają się wzajemnie, można stworzyć interfejs korzystający jednocześnie z konsoli, GUI i popup'ów, a wszystkie te elementy mogą wymieniać między sobą dane.

Ponieważ tryb tekstowy jest mocno przestarzały, a GUI dość skomplikowany, na początek zajmiemy się wyskakującymi okienkami.

Ten sposób realizacji interfejsu jest bardzo prosty, gdyż sprowadza się do wywołania pojedynczej funkcji z niewielkiego zresztą zbioru.


Dwa najważniejsze okienka: MsgBox i InputBox[edytuj]

MsgBox[edytuj]

Funkcję służące do wyświetlania na ekranie komunikatów poznaliśmy już w rozdziale "Pierwszy program", teraz opiszę ją dokładniej:

MsgBox ( flag, "tytuł", "tekst" [, czas [, hwnd]] )

Funkcja zwraca kod wciśniętego przycisku lub -1 jeżeli okno zostało zamknięte po zadanym czasie.

Kody przycisków:

1 - OK

2 - CANCEL / Anuluj (w polskiej wersji systemu operacyjnego)

3 - ABORT / Przerwij

4 - RETRY / Ponów próbę (dla flag=2 i 5)

5 - IGNORE / Ignoruj

6 - YES / Tak

7 - NO / Nie

10 - TRY AGAIN / Ponów próbę (dla flag=6)

11 - CONTINUE / Kontynuuj


flag - określa rodzaj przycisków, ikony wyświetlanej w oknie komunikatu itp. (w nawiasie wartość szesnastkowa):

KLAWISZE:

0 (0x0) - OK

1 (0x1) - OK | Cancel (OK | Anuluj)

2 (0x2) - Abort | Retry | Ignore (Przerwij | Ponów próbę | Ignoruj)

3 (0x3) - Yes | No | Cancel (Tak | Nie | Anuluj)

4 (0x4) - Yes | No (Tak | Nie)

5 (0x5) - Retry | Cancel (Ponów próbę | Anuluj)

6 (0x6) - Cancel | Try Again | Continue (Przerwij | Ponów próbę | Kontynuuj)

IKONY:

0 (0x0) - bez ikony

16 (0x10) - ikona błędu (krzyżyk w czerwonym kole) + dźwięk systemowy

32 (0x20) - ikona zapytania (znak zapytania w niebieskim kole)

48 (0x30) - ikona ostrzeżenia (wykrzyknik w żółtym trójkącie) + dźwięk systemowy

64 (0x40) - ikona informacji (i w niebieskim kole) + dźwięk systemowy

KTÓRY KLAWISZ JEST DOMYŚLNY:

0 (0x0) - pierwszy

256 (0x100) - drugi

512 (0x200) - trzeci

DODATKOWO:

4096 (0x1000) - ikonka na belce okna

262144 (0x40000) - okno otrzymuje atrybut "zawsze na wierzchu"

524288 (0x80000) - tekst na belce i w oknie wyrównywany do prawej strony


Wszystkie te atrybuty możemy łączyć poprzez dodanie odpowiadających im wartości. Jeżeli chcemy otrzymać okno z przyciskami "Tak|Nie|Anuluj", ikoną stop, domyślnym przyciskiem "Nie" i atrybutem zawsze na wierzchu,to musimy dodać liczby

3 + 16 + 256 + 262144 (prościej będzie szesnastkowo 0x40113).


"tytuł" - tekst wyświetlony na belce okna komunikatu.

"tekst" - tekst wyświetlany w okienku komunikatu. Jeżeli chcemy by był wielowierszowy to w jego treść należy wstawić znaki nowego wiersza (@LF)

czas - parametr opcjonalny, pozwala ona na zakończenie wyświetlania komunikatu po określonym czasie podanym w sekundach. Jeżeli będzie pominięty to okienko nie zamknie się samoczynnie.

Okno komunikatu będzie wyświetlone na środku ekranu. Jeżeli zamiast tytułu okna użyjemy słowa kluczowego Default, to domyślnym tytułem będzie nazwa skryptu (jak w makrze @Scriptname).

Przykład:

;jeżeli nie wciśniemy żadnego klawisza to okno zamknie się po 10s, a $kl=-1
$kl = MsgBox(0x40113, Default, "Komunikat testowy, "&@LF&"ma trzy wiersze, "&@LF&"ten jest trzeci.", 10)

InputBox[edytuj]

Jest to podstawowe okienko do wprowadzania danych z klawiatury:

InputBox ( "tytuł", "opis" [, "propozycja" [, "maskowanie" [, szerokość [, wysokość [, x [, y [, czas [, hwnd]]]]]]]] )

Funkcja zwraca tekst znajdujący się w polu wprowadzania.

Jeżeli pole jest puste, to zostaje zwrócony pusty string.

Makro @error przyjmie wartość:

0 - string jest prawidłowy

1 - naciśnięto przycisk Cancel (Anuluj) lub przycisk zamknięcia okna

2 - upłynął zadany czas oczekiwania

3 - okno InputBox nie może zostać otwarte (zazwyczaj powodem są złe wartości argumentów)

4 - okno InputBox nie może zostać otwarte na danym wyświetlaczu (monitorze)

5 - niewłaściwa wartość parametrów x lub y (po za wielkością wyświetlacza)

Można dowolnie zmieniać wielkość okienka, ale minimalny wymiar to około 190 x 115 pikseli. Rozmiar domyślny wynosi około 250 x 190 pikseli.

String zwracany nie może być dłuższy niż 254 znaki. Jeżeli tekst wprowadzony zawiera znak powrotu karetki (jak @CR) lub znaki nowego wiersza (jak @LF), zwracany string zostanie obcięty do pierwszego takiego znaku.

"tytuł" - tekst wyświetlony na belce okna (domyślnie nazwa skryptu).

"opis" - tekst wyświetlany wewnątrz okna (nie w polu wprowadzania). Jeżeli chcemy by był wielowierszowy to w jego treść należy wstawić znaki nowego wiersza (@LF).

Pozostałe parametry są opcjonalne:

"propozycja" - propozycja zwracanego stringu, jest wyświetlana w polu wprowadzania (domyślnie pusty string).

"maskowanie" - znak jaki zastąpi w polu wprowadzania wprowadzane znaki (używane przy wpisywaniu haseł). Jeżeli wstawimy spację to znaki nie będą maskowane (jest to wartość domyślna).

Jeżeli po znaku maskującym wpiszemy literę m (małą lub wielką) będzie to oznaczało, że zwracany string nie może być pusty (gdy pole wprowadzania jest puste to zostanie zablokowany przycisk "OK").

Po znaku maskującym lub po literze m możemy jeszcze podać liczbę ograniczającą maksymalną długość wprowadzanego tekstu np. "*9" lub " M12".

szerokość i wysokość - szerokość i wysokość okna w pikselach, domyślną wartość uzyskujemy wpisując liczbę ujemną lub słowo kluczowe Default.

x i y - położenie lewego górnego narożnika okna w pikselach (wartość domyślna to okno na środku ekranu).

czas - czas w sekundach po którym okno zostanie automatycznie zamknięte (domyślne jest pominięcie tego parametru, czyli okno nie zamyka się samoczynnie).


Przykład (wprowadzanie hasła o maksymalnej długości 8 znaków, okno o domyślnej wielkości, na połowie wysokości ekran, przy jego lewej krawędzi):

$sPas = InputBox("Test InputBox", "Wprowadź hasło, "&@LF&"max. 8 znaków.", "", "*M8", Default, Default, 0)


hwnd[edytuj]

Teraz należy jeszcze wyjaśnić znaczenie występującego w obu funkcjach opcjonalnego parametru "hwnd". Jest to uchwyt do okna nadrzędnego. W momencie zamknięcia naszego okna uaktywni się właśnie to nadrzędne okno.

Prześledźmy to na poniższym przykładzie:

Run("notepad.exe")                      ;uruchomienie notatnika
Run("calc.exe")                         ;uruchomienie kalkulatora
Sleep(2000)                             ;krótka przerwa aby zobaczyć co się dzieje
$hHandle = WinActivate("Bez tytułu", "") ;uaktywnienie okna notatnika i odczyt uchwytu do niego
Sleep(2000)
WinActivate("Kalkulator", "")           ;uaktywnienie okna kalkulatora
Sleep(2000)
MsgBox(0, "TEST", "Test okna nadrzędnego", Default, $hHandle)  
;ponieważ wstawiliśmy za "hwnd" uchwyt do notatnik, jego okno jest naszym oknem nadrzędnym,
;po zamknięciu MsgBox okno notatnika staje się oknem aktywnym
;pominięcie parametru (wartość domyślna) spowoduje, że uaktywni się okienko,
;które było ostatnio aktywne (czyli w naszym przykładzie kalkulator)


Karteczki na ekranie[edytuj]

Funkcje omówione w poprzednim rozdziale wyświetlały na ekranie jakiś komunikat, a następnie oczekiwały na reakcję użytkownika. Omówione teraz funkcje na nic nie czekają, wyświetlają okienko z informacją, tak długo aż nie zostanie ono zamknięte lub zastąpione innym. W tym czasie skrypt może wykonywać inne zaprogramowane czynności.

Funkcje te są więc jak "żółte karteczki" przylepiane do ekranu.


SplashTextOn[edytuj]

SplashTextOn ( "tytuł", "tekst" [, szer [, wys [, x  [, y [, opcje [, "nazwa_fontu" [, wielkość_fontu [, waga_fontu ]]]]]]]] )

Funkcja służy do wyświetlania na ekranie informacji tekstowej.

Zwraca uchwyt do okna.

Parametry:

"tytuł" - tekst wyświetlony na belce okna (domyślnie nazwa skryptu).

"tekst" - tekst wyświetlany w okienku. Jeżeli chcemy by był wielowierszowy to w jego treść należy wstawić znaki nowego wiersza (@LF).

Parametry opcjonalne:

szer i wys - szerokość i wysokość okna w pikselach (domyślnie 500x400)

x i y - położenie lewego górnego narożnika okna w poziomie i pionie (domyślnie okno na środku ekranu)

opcje - dostępne opcje określające sposób działania funkcji

0 - centrowanie tekstu, atrybut okna "zawsze na wierzchu", okno z belką tytułową, nieprzesuwne (domyślnie)

1 - okno bez belki tytułowej, sama ramka

2 - bez atrybutu "zawsze na wierzchu"

4 - wyrównanie tekstu do lewej

8 - wyrównanie tekstu do prawej

16 - okno można przesuwać (np. za pomocą myszki)

32 - centrowanie tekstu w pionie

Jak zwykle można atrybuty łączyć dodając odpowiednie wartości (np. przesuwne okno, bez atrybutu "zawsze na wierzchu" i wyrównaniem do lewej to 16 + 2 + 4 = 22).

"nazwa_fontu" - nazwa użytych fontów, zgodna z nazwami systemowymi np.:Arial, Comic Sans MS, Courier New, Lucida Console, Microsoft Sans Serif, System, Tahoma, Times New Roman, WingDings itd. (domyślnie - domyślny font systemowy).

wielkość_fontu - wielkość fontów (domyślnie 12; typowe rozmiary to: 6 8 9 10 11 12 14 16 18 20 22 24 26 28 36 48 72)

waga_fontu - tzw. waga fontu, czyli grubość linii tworzących fonty, wartość od 0 do 1000 (domyślnie 400, mniejsze wartości to fonty pocienione, większe pogrubione)

Wartości domyślne uzyskujemy wpisując zamiast wartości parametru słowo kluczowe Default (wszędzie) lub -1 (z wyjątkiem parametru nazwa_fontu gdzie podajemy pusty string "").


UWAGA: W danym czasie na ekranie może być tylko jedno okno. Ponowne wywołanie funkcji SplashTextOn zamknie najpierw poprzednio otwarte okno, a następnie otworzy nowe.

Dotyczy to także funkcji SplashImageOn. Nie można np. otworzyć jednego okna SplashTextOn, a drugiego SplashImageOn. Zawsze może być tylko jedno otwarte okno.

Przykład:

$sTxt = "Testujemy SplashTextOn"
SplashTextOn("Test okna SplashTextOn", $sTxt)
Sleep(1000)
$sTxt &= @LF&"okienko"
SplashTextOn("Test okna SplashTextOn", $sTxt)
Sleep(1000)
$sTxt &= @LF&"tekstowe."
SplashTextOn("Test okna SplashTextOn", $sTxt)
Sleep(3000)
SplashOff()

Jeżeli uruchomimy ten skrypt to zauważymy, że w momencie wymiany zawartości okno nieprzyjemnie miga. Związane jest to z kolejnym jego zamykaniem i ponownym otwieranie.

Istnieje jednak możliwość zamiany tekstu w oknie, bez jego zamykania i otwierania. Służy do tego funkcja:

ControlSetText[edytuj]

ControlSetText ( "nazwa_okna|uchwyt", "tekst", controlID, "nowy_tekst" [, flag] )

Funkcja ta wymienia we wskazanym oknie "tekst" na "nowy_tekst".

Zwraca 1 gdy operacja się powiodła, lub 0 gdy wystąpił błąd (np. nie istnieje okno, które zostało wskazane argumentami)

Parametry:

"nazwa_okna|uchwyt" - nazwa okna (tekst na belce) lub uchwyt do niego, jeżeli wprowadzimy pusty string, to musimy podać parametr "tekst"

"tekst" - tekst w oknie do którego chcemy mieć dostęp, wpisujemy tylko w przypadku, gdy w parametrze "nazwa_okna" wpisaliśmy pusty string (jeżeli nie to wstawiamy tu pusty string)

"controlID" - string kontrolny opisujący sposób oddziaływania na tekst we wskazanym oknie. Zależy on od rodzaju okna. Dla nas wystarczy, że "Static1" (koniecznie duże S) oznacza zamianę tekstu wewnątrz okna, a pusty string "" zamianę na belce okna.

flag - parametr opcjonalny określa czy okno ma być odświeżone (wyrysowane od nowa):

0 - okno nie odświeżane (wartość domyślna)

>0 - okno odświeżane


Możemy teraz przerobić nasz skrypt tak aby okno już nie migotało:

$sTxt = "Testujemy"
$hHandle = SplashTextOn("Test okna SplashTextOn", $sTxt)
Sleep(1000)
$sTxt &= @LF & "okienko"
ControlSetText($hHandle, "", "Static1", $sTxt)
Sleep(1000)
$sTxt &= @LF & "tekstowe."
ControlSetText($hHandle, "", "Static1", $sTxt)
Sleep(3000)
SplashOff()

Pozostało jeszcze opisać funkcję która kończy nasze przykłady:

SplashOff[edytuj]

SplashOff()

Zamyka ona okno utworzone przez SplashTextOn lub SplashImageOn.

Funkcja nie przyjmuje, ani nie zwraca żadnych wartości.


SplashImageOn[edytuj]

A teraz druga karteczka, tym razem wyświetlająca obrazki:

SplashImageOn ( "tytuł", "plik" [, szerokość [, wysokość [, x [, y [, opcje]]]]] )

Funkcja wyświetla okienko z obrazem bitmapowym, dopuszczalne formaty to: BMP, GIF lub JPG.

Funkcja nie zwraca żadnej wartości.

Parametry:

"tytuł" - tekst wyświetlony na belce okna (domyślnie nazwa pliku obrazu).

"plik" - nazwa pliku łącznie ze ścieżką dostępu

Pozostałe opcjonalnie:

szerokość i wysokość - szerokość i wysokość okna w pikselach (domyślnie 500x400)

x i y - położenie lewego górnego narożnika okna w poziomie i pionie (domyślnie okno na środku ekranu)

opcje - określają sposób wyświetlania okna:

0 - okno z belką tytułową z atrybutem "zawsze na wierzchu", nieprzesuwne

1 - bez belki tytułowej

2 - bez atrybutu "zawsze na wierzchu"

16 - okno może być przesuwane

I tutaj atrybuty można łączyć dodając odpowiednie wartości.

Przykład (okno przesuwne, bez atrybutu "zawsze na wierzchu":

$sFile = "e:\Programowanie\WASTA - programowanie\AutoIt3\Examples\GUI\logo4.gif"
;jeżeli nie znajdzie pliku w podanej lokacji to okno nie zostanie otwarte,
;ale żaden błąd nie będzie zgłaszany
SplashImageOn("Test SplashImageOn", $sFile, Default, 150, Default, Default, 16+2)    
Sleep(4000)
SplashOff()


Etykietki z podpowiedziami[edytuj]

ToolTip[edytuj]

Na pewno wszyscy znają małe prostokątne lub w kształcie chmurki okienka ukazujące się po najechaniu kursorem na jakiś obiekt. W okienku tym pojawiają się krótkie informacje lub podpowiedzi dotyczące wskazanego obiektu. W AutoIt można łatwo uzyskać podobny efekt, wystarczy użyć odpowiedniej funkcji:

ToolTip ( "tekst" [, x [, y [, "nazwa" [, ikona [, opcje]]]]] )

Funkcja zwraca 1 - gdy sukces, 0 - gdy "nazwa" dłuższa od 99 znaków.

Parametry:

"tekst" - treść komunikatu. Jeżeli chcemy by był wielowierszowy to w jego treść należy wstawić znaki nowego wiersza (@LF).

Pozostałe parametry opcjonalnie:

x i y - położenie w pikselach lewego górnego narożnika okienka (domyślnie pod kursorem myszki)

"nazwa" - nazwa w górnej części okienka (domyślnie brak nazwy)

ikona - określa rodzaj ikony wyświetlanej w lewej części okna:

0 - brak ikony (domyślnie)

1 - ikona informacji (i w niebieskim kole)

2 - ikona ostrzeżenia (wykrzyknik w żółtym trójkącie)

3 - ikona błędu (krzyżyk w czerwonym kole)

opcje - dodatkowe opcje wpływające na wygląd i zachowanie okienka:

0 - okienko w kształcie prostokąta (domyślne)

1 - tzw. chmurka

2 - ogonek chmurki na środku, zamiast po lewej stronie

4 - okienko będzie zawsze widoczne na ekranie, nawet jak kursor myszki znajduje się poza krawędzią ekranu

Można sumować wartości np. 1+2+4 to chmurka z ogonkiem na środku, zawsze widoczna na ekranie.

Sama wartość 2 nie powoduje żadnej zmiany w stosunku do stanu domyślnego (dla opcje=0).

Domyślne wartości parametrów można zastąpić słowem kluczowym Default.

UWAGA: Jednocześnie może być tylko jedno okienko ToolTip. Ponowne wywołanie funkcji najpierw zamknie stare okienko, a potem otworzy nowe.

Okienko etykietki ma atrybut "zawsze na wierzchu".

Wywołanie ToolTip("") zamyka okienko (bez otwierania nowego).

Przykład:

;etykietka pod kursorem, z ikonką informacji,
;chmurka z ogonkiem na środku, zawsze na ekranie 
ToolTip("Test etykietki"&@LF&"ToolTip", Default, Default, "Nazwa etykietki", 1, 1+2+4)  
Sleep(3000)
ToolTip("")                                                  ;zamknięcie etykietki
MsgBox(0,"","Etykietka została zamknięta!")

Pasek postępu[edytuj]

Przeznaczeniem paska postępu jest obrazowa prezentacja stopnia zaawansowania pewnej wykonywanej przez program komputerowy czynności. Dzięki niemu użytkownik może łatwo zorientować się ile mniej więcej czasu zajmie komputerowi zakończenie danej operacji. Jest powszechnie używany przez programistów przy czynnościach wymagających stosunkowo długiego czasu pracy komputera (kopiowanie plików, nagrywanie płyt, pakowanie i rozpakowywanie archiwów, obróbka plików multimedialnych, instalowanie programów, itp.).

Sam pasek postępu oczywiście daje programiście jedynie możliwość określenia stopnia zaawansowania, natomiast od programisty zależy na ile będzie to zgodne z rzeczywistością.

AutoIt dostarcza narzędzi do obsługi paska postępu w postaci trzech funkcji: ProgressOn, ProgressSet, ProgressOff. Wszystkie te funkcje nie zwracają żadnej wartości, należy więc wywoływać je proceduralnie.

Tworzenie okienka paska postępu[edytuj]

ProgressOn ( "tytuł", "tekst" [, "zaawansowanie" [, x [, y [, opcja]]]] )

"tytuł" - napis na belce okienka.

"tekst" - napis wewnątrz okienka, nad paskiem postępu.

"zaawansowanie" - napis obrazujący stopień zaawansowania w procentach, na początku powinniśmy wstawić 0 np.: "0 %".

x i y - położenie okienka na ekranie, domyślnie na środku ekranu

opcja - opcje okienka: 1 - okienko bez belki i ramki, 2 - atrybut "zawsze na wierzchu", 16 - okienko można przesuwać (można sumować np. 1+2, 2+16, ale 1+16 nie działa gdyż okienka bez belki nie da się przesuwać).

Zmiana danych w okienku paska postępu[edytuj]

ProgressSet ( procent [, "zaawansowanie" [, "tekst"]] )

Funkcja pozwala określić stopień postępu paska w procentach, wyrysowując jednocześnie jego graficzną reprezentację. Ponadto umożliwia zmianę napisów wewnątrz okienka.

"tekst" - napis wewnątrz okienka, nad paskiem postępu.

"zaawansowanie" - określa jaki napis ma być wstawiony za procentową wartością postępu (można np. wpisać znak procentów: " %").

Zamknięcie okienka paska postępu[edytuj]

ProgressOff ()

Przykład:

ProgressOn("Pasek postępu", "Zaawansowanie:", "0 %", -1, 10, 16)
For $i = 10 to 100 step 10
   sleep(1000)
   ProgressSet( $i, $i & " %")
Next
ProgressSet(100 , "100 %", "Zakończone!")
sleep(3000)
ProgressOff()


Ćwiczenia[edytuj]

1. Napisać skrypt porównujący wprowadzone z klawiatury hasło, z hasłem zapamiętanym w zmiennej. Skrypt powinien wyświetlić komunikat, czy hasło jest poprawne (w komunikacie umieścić odpowiednie ikonki informacyjne). Na wprowadzenie poprawnego hasła mamy 3 próby, potem skrypt powinien zakończyć działanie (wyświetlając stosowny komunikat).


2. Napisać skrypt będący przeglądarką plików. Powinien wczytywać wybrany na dysku plik i wyświetlić w okienku. Obsługa plików TXT, BMP, GIF i JPG.

Sposób wyświetlania uzależniony od typu pliku (rozpoznanie po rozszerzeniu).


Przykładowe rozwiązania: AutoIt/Ćwiczenia dla zaawansowanych - przykładowe rozwiązania