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

Лично мне удобно, что оно возникает в центре экрана по нажатию средней+левой кнопки мыши, также перемещает мою мышь в центр экрана, и ждёт отпускания данного сочетания клавиш. В зависимости, от того, на какой картинке я его отпустил, вызывается соответствующее ей приложение/сайт, если же я отпустил кнопки где-то ещё (в центре или вокруг), то оно закрывается, ничего не делая.
Картинки 100х100 px или любые (лучше квадратные), так как он сам их подгонит под 100х100
Расстояние между ними по одному пикселю (не несёт в себе никакой функции)
Соответственно итоговый размер окна 304х304
Если картинки называются img1, img2, img3 и. т. д., то вместо создания массива, можно просто заменить тот цикл на этот:
Помучившись, с написанием гаджета, отображающего расписание моих занятий для обычной системы гаджетов в windows, понял, что их написание требует достаточно специфических знаний (как разработка приложений для айфона, андроида и даже написания скриптов для AHK), которые мне нужны лишь для одного гаджета, и, соответственно, не очень нужны. Так как на AHK я пишу и так, а реализовать на нём любой гаджет, не связанный с интернетом (а такие у меня все) даже проще, чем обычными window-скими средствами, то я решил их переписать, дабы отключить встроенные вообще.
Вот, как он выглядит у меня:

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

Если кому надо — скомпилированный гаджет для выключения.
Менюшку выкладывать не буду, т.к. надо настраивать её под себя, если кому надо, могу написать 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 для настройки.