Pull to refresh

Mac Maniac

Reading time3 min
Views1.1K
Привет! Это мой первый хабратопик (не считая песочницы)
и я даже не знаю увидит его кто-нибудь или нет :-)
Ну вот мне нравится некоторые фишки на Mac которых нету в Винде. По мере возможности я пишу их на скриптовом языке AutoHotKey дабы не чувствовать себя обделённым) Что? Вы ещё не знаете про этот язык? Ну чтож, скорее сюда www.autohotkey.com. Хотя это можно написать практически на любом полноценном языке, но примеры я приведу именно на этом, потомучто главное — идея.
Может быть это кому-то покажется полезным
Отображение подключённых девайсов и их извлечение
Как всё-таки удобно, когда на рабочем столе появляется ярлык только-что подключённого девайса. И также удобно его извлечение просто перемещением на значок означающий извлечение.

Конечно же есть разные утилитки для этого процесса (к примеру DeskDrive) но к сожалению она не позволяет простым переносом на заветную кнопочку извлечь CD/USB. В Моём случае значок извлечения — это просто ярлык на cкомпилированный EXE, которыя извлекает из Drag`n`Drop буквы устройств (да-да, возможно их выделить все и кинуть туда и они все извлекутся (и CD\DVD тоже)). Чтобы у ярлыка не отображалось имя, надо нажать «переименовать» и в поле ввода зажать ALT и быстро набрать на NumPad`е 0160. это комбинация поставит невидимый символ. для того чтобы все ярлыки на рабочем столе были такими, надо для каждого ярлыка проделать это n-ое количество раз, чтобы имена не совпадали.
exe + иконка тут
Для начала рассмотрим программу извлечения:
(простая версия. кидаем на съедение ярлыки устройств — они извлекается)
#NoEnv
#NoTrayIcon

Loop ;это бесконечный цикл. обрабатываем всю группу ярлыков
{
curr:=%A_Index% ;A_Index - номер итерации цикла

;Следует обратить внимание на := и %% это не значит что в curr
;пойдёт 1,2,3... туда пойдут значение %1%, %2%, .... - а это и есть ссылки

if(curr="") ;а вот и конец нашего бесконечного цикла :-)
ExitApp ;выход из приложения

FileGetShortcut, %curr%, OutTarget ;Берём Target из ярлыка
Driveletter := SubStr(OutTarget,1,2) ;Берём букву девайса из ярлыка
;========Дальше идёт известный пример извлечения из Help по AutoHotKey=====
hVolume := DllCall("CreateFile"
, Str, "\\.\" . Driveletter
, UInt, 0x80000000 | 0x40000000 ; GENERIC_READ | GENERIC_WRITE
, UInt, 0x1 | 0x2 ; FILE_SHARE_READ | FILE_SHARE_WRITE
, UInt, 0
, UInt, 0x3 ; OPEN_EXISTING
, UInt, 0, UInt, 0)
if hVolume <> -1
{
DllCall("DeviceIoControl" ;годится как для USB, так и для CD
, UInt, hVolume
, UInt, 0x2D4808 ; IOCTL_STORAGE_EJECT_MEDIA
, UInt, 0, UInt, 0, UInt, 0, UInt, 0
, UIntP, dwBytesReturned ; Unused.
, UInt, 0)
DllCall("CloseHandle", UInt, hVolume)
}
FileRecycle, %curr% ;удаляем ярлык
}
return

Но это была простая версия. сложная с «кучей наворотов» (Как раз вверху ссылка на сложную версию) выглядит так:
* если кинута не ссылка на девайс, а файл, то перемещаем его в корзину (старый добрый MAC)
* таже самая участь постигнет ссылка не на девайс а например на папку\файл в девайсе
* тоже самое и ссылкой на Жёсткие Диски. Не надо их извлекать :-)
* при запуске программы без параметров (просто даблклик), программа проверяет
все девайсы на готовность и обновляет ярлыки на рабочем столе (удаляет лишнее, добавляет нужное) причём Иконки и имена к девайсам берём из папки exe-шника «ico». Формат имён иконок думаю понятен: (J)Мыльница.ico — это значит что это иконка для девайса J и имя на рабочем столе у него будет «Мыльница».

Но чего то не хватает, чувствуете? Ага! Хочу чтобы иконки по мере подключения появлялись сами на рабочем столе! Но вот тут есть один нюанс — для этого надо чтобы программа всегда висела в памяти, отлавливая сообщение WM_DEVICECHANGE, а на это мало кто согласится. Но всё же если вдруг:
Код + Exe
Зеркало (Webfile.ru)
конечно же есть некоторые баги: к примеру с кардридерами часто не правильно работает, но это потомучто почему-то система не посылает WM_DEVICECHANGE при вынимании или вставлении карты памяти в кардридер (кто-нибудь знает решение?
так как это тестировалось только на моей машине (XP SP3), то думаю ща будут эксепшены литься рекой :-)

p.s.: Иконки можно брать тут:
deviantArt.com
allday.ru (только после регистрации)
www.iconspedia.com
p.p.s.: как бы это не последний топик на тему Mac Maniac или «Я слишком бедный для MAC» :-)
Tags:
Hubs:
Total votes 83: ↑71 and ↓12+59
Comments56

Articles