AutoIt: un meniu plutitor!


Astăzi va fi ziua (plictisitoare pentru unii) dedicată AutoIt-ului. Am să vă fac părtaşi la un fix de-al meu care mi-a luat câteva ore să îi dau de capăt. În imaginea de mai jos vedeţi în acţiune programul PS Hot Launch VVL, pe care îl folosesc de peste cinci ani (acum cinci ani am scris despre el aici). Uneori l-aş fi abandonat (uneori, dacă moare calculatorul, meniul se poate „zăpăci”; are o formă de backup la meniu dar mai rudimentară). Şi totuşi îl folosesc zi de zi pentru că 1) îmi permite acces rapid la aplicaţii din meniul plutitor, care apare unde îmi este mouse-ul când îl invoc; 2) îmi permite să definesc combinaţii de taste (eu lansez Word-ul cu Win+W, Chrome-ul cu Win+C ş.a.m.d.). Cu alte cuvinte pentru mine e un program esenţial. Păcat că e părăsit de autori.

M-am gândit deci: e greu să faci un aşa program? Răspunsul: da, e greu, dar cu AutoIt nu e o provocare imposibilă. Vedeţi mai sus ce am reuşit să obţin cu un cod pe care l-am scris. Destul de asemănător, nu? Din nou, din sub 100 de linii de cod. Dacă aţi parcurs celelalte articole de astăzi aveţi anumite fundamente aşa că voi explica pe scurt codul. Paginaţi mai jos.

[PHP]#include
#include
#include

AutoItSetOption(„WinTitleMatchMode”, 4)
Opt(„TrayMenuMode”,1)

$TrayAfisare = TrayCreateItem(„Afisare”)
$TrayDespre = TrayCreateItem(„Despre”)
$TrayIesire = TrayCreateItem(„Iesire”)
TraySetIcon(„Shell32.dll”,25)
TraySetState()

$hGui = GUICreate(„Scurtaturi”, 0, 0,-2,-2,BitOR($WS_POPUP,$WS_BORDER),BitOR($WS_EX_TOPMOST,$WS_EX_TOOLWINDOW))

$MenuDummy = GUICtrlCreateDummy()
$MenuContext = GUICtrlCreateContextMenu($MenuDummy)
$Dictionar = GUICtrlCreateMenuItem(„&Dictionar”, $MenuContext)
$Google = GUICtrlCreateMenuItem(„&Google”, $MenuContext, „shell32.dll”, -14)
$Chrome = GUICtrlCreateMenuItem(„&Chrome”, $MenuContext, „C:\Users\Radu\AppData\Local\Google\Chrome\Application\chrome.exe”, 0)
GUICtrlCreateMenuItem(„”, $MenuContext) ;
$Notepad = GUICtrlCreateMenuItem(„&Notepad”, $MenuContext)
GUICtrlCreateMenuItem(„”, $MenuContext) ;
$SubMenu = GUICtrlCreateMenu(„D&iverse”, $MenuContext)
$Calculator = GUICtrlCreateMenuItem(„&Calculator”, $SubMenu)
GUICtrlCreateMenuItem(„”, $MenuContext) ;
$Despre = GUICtrlCreateMenuItem(„De&spre…”, $MenuContext)
$Iesire = GUICtrlCreateMenuItem(„I&esire”, $MenuContext)
GUISetState()
Afisare()

HotKeySet(„#a”, „Afisare”) ;Win+G

While 1
$Msg = GUIGetMsg()
Switch $Msg
Case $GUI_EVENT_CLOSE,$Iesire
ExitLoop
Case $Dictionar,$Google,$Chrome
MsgBox(4096,””,”Neimplementat inca.”)
Case $Despre
MsgBox(4096,””,”Acesta este programul… meu!”)
Case $Calculator
Run(„calc.exe”)
Case $Notepad
Run(„notepad.exe”)
Case Else
If ControlGetFocus(„Scurtaturi”) = „” Then
GUISetState(@SW_HIDE,$hGui)
EndIf
EndSwitch
$Msg = TrayGetMsg()
Switch $Msg
Case $TrayIesire
ExitLoop
Case $TrayDespre
MsgBox(64, „Despre…”, „Apasati Win+A.”)
Case $TrayAfisare
Afisare()
Case Else
EndSwitch
WEnd

Func Floating()
$pos = MouseGetPos()
$x = $pos[0]-1
$y = $pos[1]-1
TrackPopupMenu($hGui, GUICtrlGetHandle($MenuContext), $x, $y)
EndFunc

Func Afisare()
GUISetState(@SW_SHOW,$hGui)
Floating()
EndFunc

Func TrackPopupMenu($hWnd, $hMenu, $x, $y)
DllCall(„user32.dll”, „int”, „TrackPopupMenuEx”, „hwnd”, $hMenu, „int”, 0, „int”, $x, „int”, $y, „hwnd”, $hWnd, „ptr”, 0)
EndFunc[/PHP]

Liniile:
8-12: am definit meniul din SysTray
14: am creat o fereastră în afara ecranului, nu se vede deci; am nevoie de ea totuşi pentru a crea un meniu plutitor (un fel de meniu contextual, cu „contextul” tot ecranul)
16-30: am definit un control fictiv căruia i-am asociat un meniu contextual
32: meniul va apare la apăsarea combinaţiei Win+A
35-51: interceptăm evenimentele din meniul plutitor – nu le-am dezvoltat pe toate!!! este mai mult un cadru demonstrativ!
52-61: interceptăm evenimentele din meniul systray – afişarea meniului, despre şi ieşire
64-69: aici facem o şmecherie – aflăm unde e mouse-ul şi în acea zonă afişăm meniul contextual
71-74: afişarea meniului contextual se face cu activarea (afişarea) ferestrei pe care am creat-o în afara ecranului, ca să nu o vedem; ea trebuie să fie activă (SHOW) pentru că altfel nu îi putem folosi meniul contextual
76-88: aici folosim de fapt o componentă a Windows-ului pentru meniu, nu o componentă AutoIt (componenta AutoIt se „manifestă” doar în cadrul ferestrei, care la noi e de 0 pe 0 şi în afara ecranului)

Atât! Singura problemă este că meniul arată cam sec (fără iconiţe adică şi fără culori). Aţi văzut mai sus că am pus două versiuni ale programului. Pentru a avea „meniul” colorat am folosit o bibliotecă suplimentară, creată de un fan AutoIt, ce permite ataşarea de iconiţe la meniuri (fie ele obişnuite, contextuale sau din systray). Nu am să repet tot codul. Pe lângă includerea respectivei biblioteci (un fişier), am schimbat meniul astfel:

[PHP]$Dictionar = _GUICtrlCreateODMenuItem(„&Dictionar”, $MenuContext)
_GUICtrlODMenuItemSetIcon(-1, „shell32.dll”, -55)
$Google = _GUICtrlCreateODMenuItem(„&Google”, $MenuContext, „shell32.dll”, -14)
$Chrome = _GUICtrlCreateODMenuItem(„&Chrome”, $MenuContext, „C:\Users\Radu\AppData\Local\Google\Chrome\Application\chrome.exe”, 0)
_GUICtrlCreateODMenuItem(„”, $MenuContext) ;
$Notepad = _GUICtrlCreateODMenuItem(„&Notepad”, $MenuContext, „notepad.exe”, 0)
_GUICtrlCreateODMenuItem(„”, $MenuContext) ;
$SubMenu = _GUICtrlCreateODMenu(„D&iverse”, $MenuContext, „shell32.dll”, -25)
$Calculator = _GUICtrlCreateODMenuItem(„&Calculator”, $SubMenu, „calc.exe”, 0)
_GUICtrlCreateODMenuItem(„”, $MenuContext) ;
$Despre = _GUICtrlCreateODMenuItem(„De&spre…”, $MenuContext, „shell32.dll”, -24)
$Iesire = _GUICtrlCreateODMenuItem(„I&esire”, $MenuContext, „shell32.dll”, -28)[/PHP]

Dacă veţi compara veţi vedea că sunt aceleaşi funcţii dar au _ în faţă şi un OD pe la mijloc, în plus apar parametrii pentru indicarea iconiţei. Ea poate fi luată dintr-un DLL (exemplu prin excelenţă shell32.dll) sau chiar de la programul cu pricina. Cât despre „colorare” am folosit următoarea funcţie, cu observaţia că… da… codul culorilor nu este RGB ci BGR.

[PHP]Func SetOLBlueColors()
_SetMenuBkColor(0xece1d8)
_SetMenuIconBkColor(0x885f42)
_SetMenuIconBkGrdColor(0xE4AD87)
_SetMenuSelectBkColor(0xC2EEFF)
_SetMenuSelectRectColor(0x800000)
_SetMenuSelectTextColor(0x000000)
_SetMenuTextColor(0x000000)
EndFunc[/PHP]

Puteţi descărca executabilele şi codurile aferente de aici.

PS: Mi-a fost semnalat că arhiva ce am indicat-o la final ar avea fişiere virusate. Desigur, le puteţi considera aşa. Aveţi mai sus codul şi vedeţi cât de „virus” este. Se mai întâmpla ca programe ce interceptează taste sau lucrează pe componente Windows să fie fals identificate ca viruşi. Am verificat pe VirusTotal.com şi într-adevăr, din cei 40 de antivirusi folositi 4 au semnalat probleme. Dacă aveţi dubii cel mai bine este să aveţi Dvs AutoIt3 instalat şi să compilaţi Dvs codul (care e evident curat).


Apreciază articolul:

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

5 comentarii

  1. Vad ca ai nevoie si folosesti fele de fel de utilitare pentru diverse automatizari. As vrea sa iti recomand si eu unul care e foarte posibil sa iti inlocuiasca mai multe si sa nu mai il folosesti decat pe acesta. De ce? Te las sa il descoperi. Este vorba de Phrase Express – http://www.phraseexpress.com

    Te sfatuiesc sa vezi si link-ul acesta http://www.phraseexpress.com/docs6/09/manual.htm si sa urmaresti video-urile de la explicatii. Sunt sigur ca ai sa il gasesti foarte util. Eu il folosesc de multa vreme.

  2. radu.capan spune:

    Hehe… stiu de multi ani acest program si de fiecare data am sfarsit dezinstalandu-l. Fie pentru ca uitam de el, fie datorita unor buguri, fie pentru ca nu reuseam sa ii gasesc justificare. Sunt sigur ca pentru unele sarcini e bun – doar e un soft cunoscut – dar cu mine „mariajul” nu a mers.

  3. Pai poti face cu el cam tot ce faci tu cu mai multe programe… autoit, ps hot lounch, etc…

    Il folosesc atat pentru stocarea/inserarea de texte predefinite de genul: semnaturi e-mail, raspunsuri e-mail predefinite, bucati de cod gata facut si pastrat ca intr-o biblioteca, etc… cat si pentru prelucrari si manipulari de texte si date. Stie sa lucreze ca clipboard-ul, sa simuleze taste, sa lucreze cu variabile, etc… Imi e util inclusiv la completarea de formulare. Treaba cu introducerea de tag-urii html pt bold sau italic se face in cateva secunde si in plus poate fi restrictionata sa functioneze doar in anumite aplicatii. Lafel si treaba cu shortcut-urile la aplicatii.

    Iti sugerez din nou sa vezi al doilea link din comentariul anterior si sa cauti in text tutorialele video marcate cu o icoana de mediaplayer.

    Mi-ar placea daca vrei sa discutam pe messenger sau pe mail. Urmaresc blogul tau de multa vreme, imi place si avem lucruri in comun :)

  4. radu.capan spune:

    Poate sa creeze PhraseExpress GUI-uri? M-am reuitat pe sit si nu vad aceasta facilitate. Pentru manipulare de text e intr-adevar bun si am sa il reincerc dupa sarbatori. Poate PhraseExpress sa exporte „scripturi” ca executabile (folosibile deci de altii)? Nici aceasta nu am vazut, dar poate stii tu deja.
    Am reparcurs partea de prezentare a programului: merita sa semnalez cititorilor nostri din facilitati lui!

  5. Nu, nu face GUI-uri dar pentru exemplul tau nici nu e neaparat nevoie pentru ca in interfata lui faci un folder in care pui link-urile dorite. Folder-ului ii asignezi un shortcut si cand il apelezi ti se afiseaza doar continutul lui.

    Nu, nu exporta exe-uri dar poti salva scriptul si sa il dai altcuiva. Uite aici cateva exemple http://www.phraseexpress.com/phrases.php

    Alte facilitati care merita mentionate… poate lucra in retea, adica daca ai mai multe calculatoare toate sa foloseasca aceleasi fraze sau daca nu poti sa folosesti varianta portabila pe usb stick.

    De ce insist cu Phrase Express? Pentru ca rezolvi mai multe genuri de nevoi cu o singura aplicatie.


Lasă un răspuns

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