Lansator multiplu (cu AutoIt)


Ar fi de fapt un “AutoIt3: Despre GUI-uri, cu calm (VIII)”, dar acum îi dau alt nume pentru a semnala de fapt… o lansare de beta :) . Nu am de gând să scriu programe pentru public (scriu programe doar pentru mine, pentru nevoile mele), dar acum “produsul” chiar e utilizabil şi unora – fanilor tastelor – le va place. Premisa: dacă anumite programe sau situri le lansezi frecvent, de ce să nu o faci dintr-o simplă apăsare de taste??? Eu de exemplu lansez MS Word cu Win-W, IrfanView cu Win-I, KeePass cu Alt-Win-P ş.a.m.d. Operativitate maximă… dar trebuie desigur să ţii minte scurtăturile şi să le foloseşti (mie mi-au intrat în sânge). Puteţi în câteva secunde face aşa ceva cu LaMu.exe (lansator multiplu – poate îmi sugeraţi un titlu mai bun).

imagine

Am dorit să scriu un nou material în seria despre GUI-uri, acum dorind să reunesc mai multe controale în aceeaşi fereastră (listă, input, butoane, checkbox, tip-uri), dar m-a luat avântul şi ceea ce a început ca un test didactic s-a terminat într-un program pe care, independent de AutoIt şi de tutorialele recente, sper să îl găsiţi interesant şi util. Nefiind testat pe n calculatoare nu pot spune prea multe despre “soliditatea” lui, dar poate unii dintre Dvs mă vor ajuta şi îmi vor spune dacă merge pe calculatorul lor şi ce probleme sunt eventual.

Să zicem că doriţi să lansaţi foarte rapid situl www.yahoo.com. Daţi click pe butonul de Adăugare. Selectaţi la controale să zicem că lăsăm bifat doar Win şi scriem Y la Simbol. În dreptul la URL sau fişier scriem www.yahoo.com iar în dreptul la Nume (descriere) scriem Yahoo.com. Salvăm aceste setări dând click pe butonul al doilea. Gata. Acum cu Win-Y se va lansa imediat Yahoo. Al doilea scenariu: să zicem că dorim să lansăm rapid un program: mergem în MS Explorer şi îl tragem cu mouse-ul peste câmpul de lângă URL sau fişier (se va completa automat cu fişierul, cu cale cu tot). Mai dăm un nume, alegem ceva combinaţie cu taste şi… gata! Programul nu trebuie să stea pe ecran: Escape şi programul se mută în systray (lângă ceasul sistem). De acolo puteţi reactiva aplicaţia şi eventual ieşi din ea.

Acum că v-am vândut partea frumoasă să vedem şi minusurile: 1) este insuficient testată (aşa că rămâne mai mult tot un material didactic); 2) nu prea are măsuri împotriva prostiei. Să detaliem punctul 2: să zicem că setaţi ca la apăsarea tastei 2 să se lanseze Notepad. Nu vă aşteptaţi să mai puteţi scrie undeva ceva cu cifra 2. Morala? Nu lăsaţi fără acceleratori nici o lansare (2 e caz defectuos; Ctrl+Shift+2 poate fi OK). Apoi dacă la URL sau fişier scrieţi ceva ce nu ştie Word-ul lansa… nu va lansa. De exemplu www.google.ro îl va şti lansa, dar google.ro nu. Dacă scrieţi doar Notepad.exe îl va şti lansa, dar Word.exe nu (trebuie cu calea). Nu trebuie să fie programe, pot fi şi fişiere (txt, doc, pdf… ce doriţi Dvs). IMPORTANT: nu toate combinaţiile vor funcţiona. Windows-ul şi-a rezervat o serie de combinaţii (ex: Win+E pentru lansare MS Explorer). Deci nu vă miraţi de exemplu dacă Win+1 nu merge (Win+1 în Vista şi Windows 7 lansează prima aplicaţie din bara de aplicaţii – cele fixe, în Win 7).

Bun. Deja povestea e lungă. Să revenim la AutoIt. De fapt scopul meu acesta era: să vedem ce frumoase lucruri se pot face cu AutoIt. Aveţi mai jos codul, în întregime. Cu alte cuvinte dau nu doar programul ci şi sursa :) . E o sursă perfectibilă. Poate o voi perfecta cândva, poate combinând cu meniul plutitor. În codul de mai jos, pe care nu-l mai explic, căci sunt unele comentarii în cod, am folosit şi facilitatea de salvare şi citire dintr-un fişier INI.

[PHP]#NoTrayIcon
#include <GUIListBox.au3>
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#Include <GuiToolTip.au3>

Opt("TrayOnEventMode",1)
Opt("TrayMenuMode",1)

TraySetOnEvent($TRAY_EVENT_PRIMARYUP,"Minimizare")

GUICreate("Lansator multiplu",400,210, -1, -1, $WS_BORDER, $WS_EX_ACCEPTFILES)
GUISetIcon("lamu.ico")
$scurtaturiT = IniReadSection("lamu.ini","trimiteri")
If @error Or $scurtaturiT[0][0] = 0 Then
;nu exista fisierul lamu.ini… atunci il facem acum
IniWrite("lamu.ini","trimiteri","^+c","www.cnet.ro")
IniWrite("lamu.ini","trimiteri","^+g","www.google.ro")
IniWrite("lamu.ini","trimiteri","#n","notepad.exe")
IniWrite("lamu.ini","nume","^+c","CNet.ro")
IniWrite("lamu.ini","nume","^+g","Google.ro")
IniWrite("lamu.ini","nume","#n","Notepad")
$scurtaturiT = IniReadSection("lamu.ini","trimiteri")
EndIf
;definim scurtaturile
For $i = 1 To $scurtaturiT[0][0]
HotKeySet($scurtaturiT[$i][0], "Actiune")
Next
;cream si populam lista cu elemente
$listas = GUICtrlCreateList("", 5, 5, 130, 175)
$scurtaturiN = IniReadSection("lamu.ini","nume")
For $i = 1 To $scurtaturiN[0][0]
GUICtrlSetData(-1, $scurtaturiN[$i][1])
Next
_GUICtrlListBox_SetCurSel($listas,0)

;punem elementele pe GUI
GUICtrlCreateGroup("Accelerator",140,2,130,70)
$checkCtrl = GUICtrlCreateCheckbox("Ctrl", 150, 20, 40, 20)
GUICtrlSetTip(-1,"Tasta Ctrl","Ctrl",1)
$checkShift = GUICtrlCreateCheckbox("Shift", 220, 20, 40, 20)
GUICtrlSetTip(-1,"Tasta Shift","Shift",1)
$checkAlt = GUICtrlCreateCheckbox("Alt", 150, 45, 40, 20)
GUICtrlSetTip(-1,"Tasta Alt","Alt",1)
$checkWin = GUICtrlCreateCheckbox("Win", 220, 45, 40, 20)
GUICtrlSetTip(-1,"Tasta Win","Win",1)
GUICtrlCreateGroup("Simbol",280,2,110,70)
$litera = GUICtrlCreateInput("", 290, 20, 50, 20, BitOR($ES_LOWERCASE,$ES_AUTOHSCROLL))
GUICtrlSetTip(-1,"Puteţi să folosiţi o literă (ex: c) sau o cifră (ex: 4) " & @CRLF & "dar şi un alt simbol (precum ; sau = sau `)","Simbol",1)
GUICtrlSetLimit(-1,1)
GUICtrlCreateLabel("literă, cifră, altceva",290,45)
$actiunea = GUICtrlCreateInput("", 150, 85, 130, 20)
GUICtrlSetState(-1, $GUI_DROPACCEPTED)
GUICtrlSetTip(-1,"Scrieţi o adresă web (ex: www.google.ro) sau un fişier (ex: notepad.exe). " & @CRLF & "Pentru fişiere e bine să includeţi şi calea, fie că e executabil sau document." & @CRLF & "Cel mai uşor este să trageţi aici cu mouse-ul un fişier din MS Explorer.","URL sau fişier",1)
GUICtrlCreateLabel("URL sau fişier",290,88)
$numele = GUICtrlCreateInput("", 150, 110, 130, 20)
GUICtrlSetTip(-1,"Daţi un nume scurtăturii (nume ce va apare în lista din stânga, pentru identificare)","Nume (scurtă descriere)",1)
GUICtrlCreateLabel("Nume (descriere)",290,113)
$adauga = GUICtrlCreateButton("modifica", 150, 135, 40, 40, $BS_ICON)
GUICtrlSetImage(-1, "shell32.dll", -46)
GUICtrlSetTip(-1,"Adaugă o nouă scurtătură","Adăugare",1)
$modifica = GUICtrlCreateButton("", 190, 135, 40, 40, $BS_ICON)
GUICtrlSetImage(-1, "shell32.dll", -145)
GUICtrlSetTip(-1,"Salvează modificările pentru scurtătura activă","Modificare",1)
$sterge = GUICtrlCreateButton("", 230, 135, 40, 40, $BS_ICON)
GUICtrlSetImage(-1, "shell32.dll", -132)
GUICtrlSetTip(-1,"Ştergerea scurtăturii active","Ştergere",1)
$iesire = GUICtrlCreateButton("", 270, 135, 40, 40, $BS_ICON)
GUICtrlSetImage(-1, "shell32.dll", -28)
GUICtrlSetTip(-1,"Părăsire program","Ieşire",1)
$ajutor = GUICtrlCreateButton("", 310, 135, 40, 40, $BS_ICON)
GUICtrlSetImage(-1, "shell32.dll", -155)
GUICtrlSetTip(-1,"Ajutor (help) pentru utilizarea acestui program","Ajutor",1)
$despre = GUICtrlCreateButton("", 350, 135, 40, 40, $BS_ICON)
GUICtrlSetImage(-1, "shell32.dll", -278)
GUICtrlSetTip(-1,"Informaţii despre program","Despre",1)

GUISetState(@SW_SHOW)
Aranjeaza()
While 1
$msg = GUIGetMsg()
If $msg = $GUI_EVENT_CLOSE Or $msg = $GUI_EVENT_MINIMIZE Then
;hopa, ascunde fereastra, dar functiile raman active
GuiSetState(@SW_HIDE)
TraySetState(1)
TraySetToolTip("Click aici ca sa reapara fereastra de configurare!")
TraySetIcon("Shell32.dll",-77)
EndIf
Switch $msg
Case $listas
;daca sa dat click pe un element din lista trebuie sa actualizam checkbox-urile si celelalte
Aranjeaza()
Case $adauga
;adaugam un element fictiv, iar utilizatorul va defini exact ce vrea
GUICtrlSetData($listas, "___________")
IniWrite("lamu.ini", "nume", "^!+#0", "___________")
IniWrite("lamu.ini", "trimiteri", "^!+#0", "––––")
$scurtaturiN = IniReadSection("lamu.ini","nume")
$scurtaturiT = IniReadSection("lamu.ini","trimiteri")
_GUICtrlListBox_SetCurSel($listas,0)
Aranjeaza()
Case $sterge
;ne asiguram ca nu a apasat din greseala pe buton
$accept = MsgBox(49,"Sigur-sigur?","Sunteţi pe cale să ştergi această scurtătură. Nu există recuperare automată, decât dacă reintroduceţi Dvs datele, manual! Gândiţi-vă de două ori, ştergeţi o singură dată. Click pe Cancel dacă nu sunteţi sigur.")
If $accept = 1 And $scurtaturiN[0][0]>1 Then
For $i = 1 To $scurtaturiN[0][0]
If $scurtaturiN[$i][1] = GUICtrlRead($listas) Then
;anulam scurtatura
HotKeySet($scurtaturiT[$i][0])
;si o stergem din lamu.ini
IniDelete("lamu.ini","nume", $scurtaturiN[$i][0])
IniDelete("lamu.ini","trimiteri", $scurtaturiT[$i][0])
EndIf
Next
_GUICtrlListBox_DeleteString($listas,_GUICtrlListBox_GetCurSel($listas))
$scurtaturiN = IniReadSection("lamu.ini","nume")
$scurtaturiT = IniReadSection("lamu.ini","trimiteri")
_GUICtrlListBox_SetCurSel($listas,0)
Aranjeaza()
EndIf
Case $modifica
;stergem vechea scurtatura
For $i = 1 To $scurtaturiN[0][0]
If $scurtaturiN[$i][1] = GUICtrlRead($listas) Then
IniDelete("lamu.ini","nume", $scurtaturiN[$i][0])
IniDelete("lamu.ini","trimiteri", $scurtaturiT[$i][0])
EndIf
Next
;actualizam textul in lista
$indexvechi = _GUICtrlListBox_GetCurSel($listas)
_GUICtrlListBox_ReplaceString($listas, $indexvechi, GUICtrlRead($numele))
;reconstituim noua scurtatura
$combinatia=""
If BitAND(GUICtrlRead($checkCtrl), $GUI_CHECKED) = $GUI_CHECKED Then
$combinatia &= "^"
EndIf
If BitAND(GUICtrlRead($checkAlt), $GUI_CHECKED) = $GUI_CHECKED Then
$combinatia &= "!"
EndIf
If BitAND(GUICtrlRead($checkShift), $GUI_CHECKED) = $GUI_CHECKED Then
$combinatia &= "+"
EndIf
If BitAND(GUICtrlRead($checkWin), $GUI_CHECKED) = $GUI_CHECKED Then
$combinatia &= "#"
EndIf
;o scriem in fisierul INI
$act = GUICtrlRead($actiunea)
$act = StringReplace($act,"––––","")
IniWrite("lamu.ini", "trimiteri", $combinatia & GUICtrlRead($litera), $act)
IniWrite("lamu.ini", "nume", $combinatia & GUICtrlRead($litera), GUICtrlRead($numele))
;si recitim fisierul
$scurtaturiN = IniReadSection("lamu.ini","nume")
$scurtaturiT = IniReadSection("lamu.ini","trimiteri")
;si refacem atunci si scurtaturile
For $i = 1 To $scurtaturiT[0][0]
HotKeySet($scurtaturiT[$i][0], "Actiune")
Next
;revenim pe elementul ce era selectat
_GUICtrlListBox_SetCurSel($listas, $indexvechi)
Case $ajutor
Ajutor()
Case $despre
Despre()
Case $iesire
ExitLoop
EndSwitch
WEnd
GUIDelete()

Func Actiune()
For $i = 1 To $scurtaturiT[0][0]
If $scurtaturiT[$i][0] = @HotKeyPressed Then
ShellExecute($scurtaturiT[$i][1])
EndIf
Next
EndFunc

Func Minimizare()
GuiSetState(@SW_Show)
TraySetState(2)
EndFunc

Func Aranjeaza()
$ales = GUICtrlRead($listas)
For $i = 1 To $scurtaturiN[0][0]
$scurt = $scurtaturiN[$i][0]
If $ales = $scurtaturiN[$i][1] Then
If StringInStr($scurt,"^") Then
GUICtrlSetState($checkCtrl,$GUI_CHECKED)
Else
GUICtrlSetState($checkCtrl,$GUI_UNCHECKED)
EndIf
If StringInStr($scurt,"!") Then
GUICtrlSetState($checkAlt,$GUI_CHECKED)
Else
GUICtrlSetState($checkAlt,$GUI_UNCHECKED)
EndIf
If StringInStr($scurt,"+") Then
GUICtrlSetState($checkShift,$GUI_CHECKED)
Else
GUICtrlSetState($checkShift,$GUI_UNCHECKED)
EndIf
If StringInStr($scurt,"#") Then
GUICtrlSetState($checkWin,$GUI_CHECKED)
Else
GUICtrlSetState($checkWin,$GUI_UNCHECKED)
EndIf
GUICtrlSetData($litera, StringRight($scurt,1))
GUICtrlSetData($actiunea, $scurtaturiT[$i][1])
GUICtrlSetData($numele, $scurtaturiN[$i][1])
EndIf
Next
EndFunc

Func Ajutor()
MsgBox(32,"Ajutor","Programul vine cu două situri şi un program deja definite, dar acestea pot fi şterse sau modificate." & @CRLF & @CRLF & "Pentru a adăuga o scurtătură nouă daţi click pe primul buton după care alegeţi scurtătura de taste, scrieţi adresa web sau fişierul (cu cale cu tot), şi indicaţi un nume (care apare în lista din stânga). Pentru fişiere puteţi foarte uşor să trageţi unul cu mouse-ul din MS Explorer în câmpul pentru fişier şi se va completa automat cu tot cu cale." & @CRLF & @CRLF & "Atenţie: nu orice scurtături vor merge, pentru simplul faptul că Windows-ul şi le rezervă pe unele." & @CRLF & @CRLF & "Cu Escape aplicaţia trece în modul minimizat, ascuns – de fapt este în lista iconiţelor de lângă ceasul sistem, de unde o puteţi reactiva. O puteţi închide doar cu butonul roşu de ieşire." & @CRLF & @CRLF & "Mutaţi mouse-ul peste elementele interfeţei pentru a afla rolul lor.")
EndFunc

Func Despre()
MsgBox(64,"Despre","Acest program vă permite să definiţi scurtături din taste (shortcuts) către adrese web dar şi fişiere (fie ele documente sau programe). Dacă v-aţi dorit să puteţi lansa Notepad cu Win+N sau Google cu Ctrl+Shift+G, acum o puteţi face cu uşurinţă!" & @CRLF & @CRLF & "(c) 2010 www.cnet.ro" & @CRLF & @CRLF & "versiunea 1.0 – beta")
EndFunc[/PHP]

PS: Vă rog, cine poate să îl testeze, să îmi dea un feedback. Cine vrea să folosească sursa, o poate face dar în limitele bunului simţ. Dacă „limitele bunului simţ” e neclar mai bine să nu folosească deloc.

PS: Toate fişierele acestei serii de tutoriale sunt publice şi descărcabile de aici. Exemplele de aici sunt fereastra12.au3 cu executabilul lamu.exe.


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (2 evaluări, media: 5,00 din 5)
Loading...Loading...

2 comentarii

  1. DanMedesan spune:

    Salut, as vrea sa il testez eu si daca poti sa ma ajuti sa implementez si Fn Key, pana acum nu am facut cu AutoIT si o sa dureze pana i dau de cap la acesta.

  2. radu.capan spune:

    Documentatia AutoIt spune: „Most laptop computer keyboards have a special Fn key. This key cannot be simulated.” Deci… doar un workaround, dar pt moment nu cunosc. Ma mai uit.


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *