1

Тема: 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

2

Re: AHK: Недавние папки (RcntFlds)

OFF: Я думал, что один я только не сплю по ночам...

3

Re: AHK: Недавние папки (RcntFlds)

DD, хотелось бы поподробнее описание скрипта.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

4

Re: AHK: Недавние папки (RcntFlds)

Mikki, ничего существенного на ум нейдёт, какие бы усилия ни прикладывал. Честно.
Grey, час-то был утренний, хотя филин я тот ещё!