Тема: AHK: Недавние папки (RcntFlds)
Бесцеремонно позаимствовал и внёс, по своему обыкновению, характерные неповторимые изменения: изрядно подсократив, добавил такие мелочи, как перемещение вновь открытой папки вверх меню, открытие последней активной (по Ctrl+Shift+CapsLock), некоторые другие.
Отказался от таймера (сбивается, и вообще), — его место занял Левый клик по тройке контролов Проводника.
Меню выпорхнет на зов — Ctrl+Shift+СредняяМышь.
Gosub, AutoexecRcntFldsMenu
GroupAdd, Explorer, ahk_class CabinetWClass
GroupAdd, Explorer, ahk_class ExploreWClass
#IfWinActive, ahk_group Explorer
~LButton::
SetBatchLines, -1
CoordMode, Mouse, Screen
SetMouseDelay, -1
SetKeyDelay, -1
MouseGetPos, ClickX, ClickY, WindowUnderMouseID
SendMessage, 0x84,, ( ClickY << 16 )|ClickX,, ahk_id %WindowUnderMouseID%
WM_NCHITTEST_Result =%ErrorLevel%
;SysListView321,ToolbarWindow322,ToolbarWindow323, заголовок окна
If WM_NCHITTEST_Result in 0,1,2 ;основные Control`ы Проводника
{
Gosub, rf_trackfolders
Return
}
RETURN
#IfWinActive
AutoexecRcntFldsMenu:
SetTitleMatchMode, Slow ; включает медленный надежный режим
foldernum=100 ;максимально возмож-е колич папок
;;rf_timer=5000
folders = ;C:\`n
1rf_hkey=^+MButton ;Ctrl+Shift+СКМ
2rf_hkey=^+CapsLock ;Ctrl+Shift+CapsLock
Hotkey %1rf_hkey%,RecentFldsMenuShow
Hotkey %2rf_hkey%,OpenLastFolder
Gosub menu_build
;;;;;;;;;;;;;;;;;;;;;;;;SetTimer, rf_trackfolders, %rf_timer%
RETURN
rf_trackfolders:
IfWinNotActive, ahk_group Explorer
return
;;;;;;;;;;;;;;;;;;;;;;;;;;SetTimer, rf_trackfolders, off
WinGetTitle, rf_current_win, ahk_group Explorer
WinGetText, rf_win_info, %rf_current_win%, %rf_current_win%,
StringSplit, rf_new_folder, rf_win_info,`n
rf_new_folder= %rf_new_folder1%
StringTrimRight, rf_new_folder, rf_new_folder, 1
SecondLetter := substr(rf_new_folder,2,1)
permitted := false
if Secondletter = :
permitted := true
if rf_new_folder in Desktop,Рабочий стол,My Documents,Мои документы
permitted := true
if (! permitted)
return
IsNew = 1
loop %folders0%
{
folder := folders%a_index%
if rf_new_folder = %folder%
IsNew =
}
if IsNew
{
folders =%rf_new_folder%`n%folders%
gosub menu_build
}
;;;;;;;;;;;;;;;;;;;;;;;;;;SetTimer, rf_trackfolders, %rf_timer%
RETURN
rf_launch:
if A_ThisMenuItem in Desktop,Рабочий стол
{
Run, %A_Desktop%
return
}
If A_ThisMenuItem in My Documents,Мои документы
{
Run, %A_MyDocuments%
return
}
else
IfExist, %A_ThisMenuItem%
run %A_ThisMenuItem%
Else
{
Traytip,,E`nr`nr`no`nr
Sleep, 600
TrayTip, Off
}
RETURN
menu_build:
stringreplace folders,folders,`r,,A
stringsplit folders,folders,`n
folders =
folders0 -= 1
menu RcntFldsMenu, useErrorLevel
;Menu RcntFldsMenu, NoStandard
menu RcntFldsMenu, deleteAll
Menu RcntFldsMenu, Add, Недавние — вот вы какие..., rf_trackfolders
Menu RcntFldsMenu, Default, Недавние — вот вы какие...
Loop, %folders0%
{
if (a_index > foldernum)
{
folders0 := foldernum
break
}
folders .= folders%a_index% "`n"
folders0=%folders0%%A_LoopFileTimeModified%`t%A_LoopFileName%`n ;sortbydate
Menu, RcntFldsMenu, Add, % folders%a_index%, rf_launch
}
RETURN
RecentFldsMenuShow:
Menu, RcntFldsMenu, Show
RETURN
OpenLastFolder:
IfExist, %rf_new_folder%\
Run, %rf_new_folder%\
If ErrorLevel <> 0
{
Traytip,,E`nr`nr`no`nr
Sleep, 600
TrayTip, Off
}
RETURN