Pull to refresh

Интерфейс в Windows на прокачку с помощью AutoHotKey

Уже давно пользуюсь программой AutoHotKey, чтобы сделать интерфейс Windows более удобным для меня. Поискав на хабре, я обнаружил, что статей о таком многофункциональном и, имхо, замечательном скриптовом языке достаточно мало (хотя есть и очень здоровская), а самое главное, я не нашёл ни одной статьи о реализации одной из самых важных (по моему мнению) возможностей этой программы, а именно создание своих GUI окон.

Под катом удобная возникающая менюшка для быстрого запуска программ/открытия сайтов и «гаджет» для выключения компьютера.

Меню


Моё меню
Лично мне удобно, что оно возникает в центре экрана по нажатию средней+левой кнопки мыши, также перемещает мою мышь в центр экрана, и ждёт отпускания данного сочетания клавиш. В зависимости, от того, на какой картинке я его отпустил, вызывается соответствующее ей приложение/сайт, если же я отпустил кнопки где-то ещё (в центре или вокруг), то оно закрывается, ничего не делая.

Структура:

Картинки 100х100 px или любые (лучше квадратные), так как он сам их подгонит под 100х100
Расстояние между ними по одному пикселю (не несёт в себе никакой функции)
Соответственно итоговый размер окна 304х304

Собственно код:

MButton & LButton::
Gui, +AlwaysOnTop -SysMenu -Caption +ToolWindow ; Убираем все рамки и иконку с таскбара

;Массив картинок (далее будет альтернативное решение, если картинки называются img1, img2, img3 и т. д.)
ql_img1:="evernote.jpg"
ql_img2:="vkontakte.jpg"
ql_img3:="fto.jpg"
ql_img4:="googledocs.jpg"
ql_img5:="empty" ; Центральное место я предпочёл оставить пустым
ql_img6:="rutracker.jpg"
ql_img7:="googlereader.jpg"
ql_img8:="lastfm.jpg"
ql_img9:="beeline.jpg"

Loop, 9{
the_pic:=ql_img%A_Index%
if(the_pic!="empty"){
row:=A_Index-1 ; Вычисляем позицию картинке в таблице
row/=3 ; Воспользуемся тем, что /= от целого выдаёт целое
coll:=A_Index-1-(row*3)
the_x:=1+(coll*101)
the_y:=1+(row*101)
Gui, Add, Picture, x%the_x% y%the_y% w100 h100 hwndP%A_Index%, image\%the_pic%
; Создаём картинку, создав при этом указатель на неё в виде Px, где x - номер её ячейки
}
}
CoordMode, Mouse, Screen
MouseMove, (A_ScreenWidth/2), (A_ScreenHeight/2) ; Центрируем мышь
CoordMode, Mouse, Relative

Gui, Show,Center h304 w304, Quick Link Menu ; Создаём само окно
return

MButton & LButton UP::
MouseGetPos,,,, VarControl, 2 ; Получаем указатель на объект, над которым была мышь
Gui, Destroy ; Уничтожаем окно

; Массив выполняемых программ/сайтов
ql_link1="C:\Program Files (x86)\Evernote\Evernote\Evernote.exe"
ql_link2=http://vkontakte.ru
ql_link3=http://free-torrents.org
ql_link4=http://docs.google.com
ql_link5=
ql_link6=http://rutracker.org
ql_link7=http://www.google.ru/reader/view/?hl=ru&tab=wy#overview-page
ql_link8=http://www.lastfm.ru/
ql_link9=http://www.beeline.ru/sms/index.wbp

Loop, 9{
; Сравниваем указатели, и выполняем соответствующую команду
if(VarControl = P%A_index%){
the_link:=ql_link%A_Index%
Run, %the_link%
}
}
return

; А это, чтобы средняя кнопка мышь продолжала работать
MButton UP::Send, {MButton}


Если картинки называются img1, img2, img3 и. т. д., то вместо создания массива, можно просто заменить тот цикл на этот:
Loop, 9{
if(A_Index!=5){
row:=A_Index-1 ; Вычисляем позицию картинке в таблице
row/=3 ; Воспользуемся тем, что /= от целого выдаёт целое
coll:=A_Index-1-(row*3)
the_x:=1+(coll*101)
the_y:=1+(row*101)
Gui, Add, Picture, x%the_x% y%the_y% w100 h100 hwndP%A_Index%, image\img%A_Index%.jpg
; Создаём картинку, создав при этом указатель на неё в виде Px, где x - номер её ячейки
}
}


Гаджет для выключения


Помучившись, с написанием гаджета, отображающего расписание моих занятий для обычной системы гаджетов в windows, понял, что их написание требует достаточно специфических знаний (как разработка приложений для айфона, андроида и даже написания скриптов для AHK), которые мне нужны лишь для одного гаджета, и, соответственно, не очень нужны. Так как на AHK я пишу и так, а реализовать на нём любой гаджет, не связанный с интернетом (а такие у меня все) даже проще, чем обычными window-скими средствами, то я решил их переписать, дабы отключить встроенные вообще.

Вот, как он выглядит у меня:
Выключалка

Особенности:

  • Большие кнопки (а на самом деле, такие кнопки, какие я хочу)
  • Возможность устанавливать любое количество и любые команды для кнопок
  • Возникновение уточняющих диалогов («вы точно хотите это сделать?») причём только тогда, когда нужно
  • Если AHK работает и так, то отключение службы гаджетов windows уменьшит нагрузку на систему


О прозрачности

По мне, так, один из недостатков AHK — это приличный геморрой с прозрачностью окон. В смысле полупрозрачными-то их сделать легко, а вот частично прозрачными можно сделать только один цвет. И, если я не ошибаюсь, то прозрачность картинок они тоже не поддерживают. Поэтому, чтобы сделать закруглённые углы, пришлось воспользоваться приёмом, который я когда-то обнаружил, роясь в папке с Civilisation II. А именно, сделать фон картинок не прозрачным, а неиспользуемого цвета. Я выбрал синий (#0000FF)
Рестарт

Собственно код:

Gui, -Caption -Resize -SysMenu +ToolWindow ; Чтобы окно не имело ни заголовка, ни рамки ни иконки в таскбаре
Gui, Color, 0000FF ; Задаём фоном тот же синий цвет

; Добавляем картинки. gShut, gRest и gSleep - так называемые g-label-ы. По сути указатели, куда переходить скрипту по нажатию на соответствующей кнопке
Gui, Add, Picture, x0 y0 gShut, img\shutdown.gif
Gui, Add, Picture, x67 y0 gRest, img\restart.gif
Gui, Add, Picture, x134 y0 gSleep, img\sleep.gif
Gui, Show, x10 y900 h64 w198, ShutDown Menu ; Отображаем окно
WinSet, TransColor, 0000FF, ShutDown Menu ; Делаем синий прозрацным
return

; Выключение, с предварительным диалогом
Shut:
MsgBox, 4, Shutdown, Ты точно хочешь ВЫКЛЮЧИТЬ компьютер?, 10
IfMsgBox, Yes
Shutdown, 1
Return

; Перезагрузка
Rest:
MsgBox, 4, Restart, Ты точно хочешь ПЕРЕЗАГРУЗИТЬ компьютер?, 10
IfMsgBox, Yes
Shutdown, 2
Return

; Переход в спящий режим
Sleep:
DllCall("PowrProf\SetSuspendState", "int", 0, "int", 0, "int", 0)
Return


Если кому надо — скомпилированный гаджет для выключения.
Менюшку выкладывать не буду, т.к. надо настраивать её под себя, если кому надо, могу написать GUI для настройки.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.