Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Popup menus at screen edges – recent documents


  • Please log in to reply
34 replies to this topic
Laszlo
  • Moderators
  • 4713 posts
  • Last active: Mar 31 2012 03:17 AM
  • Joined: 14 Feb 2005
It is easy to mimic the auto-hide behavior of the taskbar. When the mouse cursor is at a specified region on the edge of the screen, for about 1 second, a menu pops up. It is controlled by a slow running timer (4 times a second – without any measurable processor load). Different actions are performed at different regions, like with mouse gestures, but w/o the need for pressing any button or keyboard key.

In the script below two easy examples are provided: at the top of the screen a list of programs is shown, which can also contain documents or Internet shortcuts. Clicking on one, or pressing the Up/Down arrow keys and Enter, runs the associated program. Clicking outside of the menu or pressing Esc cancels.

The other example is more interesting. A menu pops up on the left edge of the screen, showing a list of document types I often work with. The bottommost entry is CleanUp, which checks the entries in the Windows Recent Documents list, end deletes the broken shortcuts (linking to files not there any more). There are also menu items for deleting a link, or showing all links pointing to recently used documents, and selecting one opens it with its default application.

This menu also contains items named by often used file extensions, like DOC, TXT. Activating one of them pops up another menu, with the files of this type, referenced in the Windows Recent Documents folder. Activating one starts a specified application with the selected file.

There are many possible extensions. For example, the list of programs, the boundaries of the regions could be read from an ini file, dynamically updated.

Version 1.2

#Persistent
CoordMode Mouse, Screen
CoordMode Menu,  Screen
Recent = %HOME%\Recent              ; = %USERPROFILE%\Recent

XX := 0 "," 190 "," A_ScreenWidth -185 "," A_ScreenWidth -2 "," 9999
StringSplit XX, XX, `,              ; Region boundaries
YY := 0 "," 190 "," A_ScreenHeight-185 "," A_ScreenHeight-2 "," 9999
StringSplit YY, YY, `,

Loop 5                              ; MenuXY <- desired menu.
   Menu1%A_Index% = LeftMenu        ; 11 21 31 41 51    Left  1Y
Loop 5                              ; 12 22 32 42 52    Right 5Y
   Menu%A_Index%1 = TopMenu         ; :    ....    :    Top   X1
                                    ; 15 25 35 45 55    Botm  X5
Menu TopMenu, Add, WinWord, RUN
Menu TopMenu, Add, NotePad, RUN
Menu TopMenu, Add, CMD,     RUN
Menu TopMenu, Add, Calc,    RUN
Menu TopMenu, Add, www.autohotkey.com, RUN
; ... further menu items
                                    ; EDIT BELOW: ,FileType>Application Path
Types= AHK>C:\Program Files\Multi-Edit 9.10\Mew32.exe
      ,DOC>C:\Program Files\Microsoft Office\OFFICE11\WinWord.exe
      ,MHT>C:\Program Files\Internet Explorer\IEXPLORE.EXE
      ,PDF>C:\Program Files\Adobe\Acrobat 6.0\Acrobat\Acrobat.exe
      ,PPT>C:\Program Files\Microsoft Office\OFFICE11\POWERPNT.EXE
      ,RTF>C:\Program Files\Microsoft Office\OFFICE11\WinWord.exe
      ,TXT>C:\WINDOWS\NOTEPAD.EXE
      ,XLS>C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE

Menu LeftMenu,Add,[recent],LeftAgain ; Item1 = title
Menu LeftMenu,Add                    ; Separator
Loop Parse, Types, `,
{
   StringSplit t, A_LoopField, >
   Menu LeftMenu, Add, %t1%, ShowRecent
   App%t1% = %t2%                   ; Setup AppXXX vars for fast call
}
Menu LeftMenu,Add                   ; Separator
Menu LeftMenu,Add,ShowAll>, ShowAll ; After extensions, other menu items
Menu LeftMenu,Add,DelLink>, DelLink
Menu LeftMenu,Add,CleanUp>, CleanUp
; ... further menu items

Menu DocMenu, Add                   ; Dummy entry for 1st DeleteAll
Pcount = 1

SetTimer Edge, 250
Return

Edge:
   MouseGetPos X, Y
   P0 = %Pos%                       ; Previous mouse position
   Loop 5
      If (X <= XX%A_Index%) {
         Pos = %A_Index%            ; X region
         Break
      }
   Loop 5
      If (Y <= YY%A_Index%) {
         Pos = %Pos%%A_Index%       ; Position = XregionYregion
         Break
      }
   Pcount := Pcount*(P0=Pos) + 1    ; How long in this region
   If (Pcount <> 4 or Menu%Pos% = "")
      Return
   Menu % Menu%Pos%, Show
Return

RUN:
   Run %A_ThisMenuItem%
Return

LeftAgain:                          ; No real selection: re-show menu
   Menu leftMenu, Show, %X%, %Y%
Return

DelLink:
   Action = DeleteLink
   Goto Show
ShowAll:
   Action = RunLink
Show:
   Menu DocMenu, DeleteAll
   Loop %Recent%\*.lnk
   {
      StringTrimRight file,A_LoopFileName,4  ; remove .lnk
      Menu DocMenu, Add, %file%, %Action%
   }
   Menu DocMenu, Show, 0            ; Show still on the left
Return

RunLink:                            ; Run default application with document
   FileGetShortcut %Recent%\%A_ThisMenuItem%.lnk, file
   Run "%file%"
Return

DeleteLink:                         ; Delete selected link
   FileGetShortcut %Recent%\%A_ThisMenuItem%.lnk, file
   MsgBox 4,,Delete Shortcut to`n%file%
   IfMsgBox Yes
      FileDelete %Recent%\%A_ThisMenuItem%.lnk
GoTo LeftAgain                       ; Re-show Left menu

ShowRecent:
   Menu DocMenu, DeleteAll
   type = %A_ThisMenuItem%          ; Used in Open:
   Loop %Recent%\*.%type%.lnk
   {
      StringTrimRight file,A_LoopFileName,4  ; remove .lnk
      Menu DocMenu, Add, %file%, Open
   }
   Menu DocMenu, Show, 0            ; Show still on the left
Return

Open:                               ; Open linked file
   FileGetShortcut %Recent%\%A_ThisMenuItem%.lnk, file
   Run % App%type% " """ file """"
Return

CleanUp:                            ; Remove broken links
   Loop %Recent%\*.lnk
   {
      FileGetShortcut %A_LoopFileFullPath%, file
      If !FileExist(file) {
         ToolTip Deleting %A_LoopFileFullPath%
         FileDelete %A_LoopFileFullPath%
         Sleep 100
      }
      ToolTip                       ; Remove last tooltip
   }
Return

Edit 20060320: Single place for changes
Edit 20060320:
- Added "ShowAll" to Recent Documents menu, which shows all the links, and opens the selected document with its default application.
- Added "DelLink" to Recent Documents menu, which shows all the links. Selecting one removes the shortcut to the selected document.
- Defined 25 regions, where the mouse cursor is detected, 12 are on the edges of the screen. If the mouse is there for 4 timer periods (1…1.25 second), the menu pops up with the name MenuXY, with X and Y = 1…5. 1 corresponds the left/top edge, 5 corresponds to the right/bottom edge of the screen. The numbers in between denote left/mid/right or top/mid/low regions.
- The boundaries between the regions are defined in the strings assigned initially to XX and YY. They contain 5 numbers separated by commas, starting with 0, ending with a large number.

Rabiator
  • Members
  • 292 posts
  • Last active: Aug 29 2016 09:29 PM
  • Joined: 17 Apr 2005
Nice and expandable idea!

Laszlo
  • Moderators
  • 4713 posts
  • Last active: Mar 31 2012 03:17 AM
  • Joined: 14 Feb 2005
I updated the script in the original post to version 1.1. Any change in the list of file extensions and the corresponding applications has to be entered in only ONE place, making it easier to adapt the script.

Laszlo
  • Moderators
  • 4713 posts
  • Last active: Mar 31 2012 03:17 AM
  • Joined: 14 Feb 2005
Version 1.2 is posted:
- Added "ShowAll" to Recent Documents menu, which shows all the links, and opens the selected document with its default application.
- Added "DelLink" to Recent Documents menu, which shows all the links. Selecting one removes the shortcut to the selected document.
- Defined 25 regions, where the mouse cursor is detected, 12 are on the edges of the screen. If the mouse is there for 4 timer periods (1…1.25 second), the menu pops up with the name MenuXY, with X and Y = 1…5. 1 corresponds the left/top edge, 5 corresponds to the right/bottom edge of the screen. The numbers in between denote left/mid/right or top/mid/low regions.
- The boundaries between the regions are defined in the strings assigned initially to XX and YY. They contain 5 numbers separated by commas, starting with 0, ending with a large number.

Rhys
  • Members
  • 761 posts
  • Last active: Aug 09 2013 04:53 PM
  • Joined: 17 Apr 2007
I like the script! Thanks for mentioning it or I would have missed it - I may be missing something, but I can't get the left menu to work - Clicking the items won't do anything that I can see.

Laszlo
  • Moderators
  • 4713 posts
  • Last active: Mar 31 2012 03:17 AM
  • Joined: 14 Feb 2005
In Vista the location of the recently used files changed. Replace
Recent = %HOME%\Recent
with
EnvGet APP,APPDATA

Recent = %APP%\Microsoft\Windows\Recent


jak
  • Members
  • 159 posts
  • Last active: Dec 16 2010 11:26 PM
  • Joined: 28 Feb 2006
thanks for this, it rocks. Its so hard to find a decent "recent documents" app. This one is just about perfect :)

One thing I noticed though, the list of documents it shows, is alphabetical. Since this is about "recent" docs, wouldnt it make more sense to have them show by date modified (descending)? Is there a way to modify the existing script so it can do that?

Also I was wondering if there was a way to have it also show "recent folders" (not just documents)? I poked around on the forum but didnt really find anything like that (much to my surprise, it probably exists but I didnt see it with the keywords I was searching under...)

Laszlo
  • Moderators
  • 4713 posts
  • Last active: Mar 31 2012 03:17 AM
  • Joined: 14 Feb 2005

show by date modified (descending)

See the AHK help, under Loop FilePattern, Example#4.

also show "recent folders" (not just documents)

Under the label "Show:", the line "Loop %Recent%\*.lnk" can be extened by ", 1" to include folders. In the beginning of the loop block you have to add code to process the retrieved folder.

jak
  • Members
  • 159 posts
  • Last active: Dec 16 2010 11:26 PM
  • Joined: 28 Feb 2006
thanks laszlo

In the beginning of the loop block you have to add code to process the retrieved folder.


I could do the first part, but "process the retrieved folder" - I think that may stump me...

webber
  • Members
  • 129 posts
  • Last active: Aug 13 2011 06:45 PM
  • Joined: 25 Aug 2005
menu appears as supposed to, but clicking on any item seems to do nothing.

I edited:

EnvGet APP,APPDATA
Recent = %APP%\Microsoft\Windows\Recent

I edited the file types/apps as to my system - but still no result.

besides show a menu , what is this supposed to do :?:
________
Vaporite Solo Vaporizer

Laszlo
  • Moderators
  • 4713 posts
  • Last active: Mar 31 2012 03:17 AM
  • Joined: 14 Feb 2005
It supposed to open submenus with recent files, and selecting one should launch it in the corresponding application.

Drugwash
  • Members
  • 1078 posts
  • Last active: May 24 2016 04:20 PM
  • Joined: 07 Sep 2008
If you modify the beginning of the script to the following, it should work in Win9x too (not sure about multi-user 9x setups):
#Persistent
CoordMode Mouse, Screen
CoordMode Menu,  Screen
If A_OSType in WIN32	; enables this script in Win95/98/ME
	Recent = %A_WinDir%\Recent
else
	Recent = %HOME%\Recent              ; = %USERPROFILE%\Recent

(AHK 1.0.48.05 and Win98SE) forever | My scripts are here


Laszlo
  • Moderators
  • 4713 posts
  • Last active: Mar 31 2012 03:17 AM
  • Joined: 14 Feb 2005
Thanks! Most of us have only one computer, with one Windows version, so the posted scripts should be considered as code samples. We have to rely on users' feedback, so testing and adapting scripts for other Windows versions is valuable for the AHK community.

webber
  • Members
  • 129 posts
  • Last active: Aug 13 2011 06:45 PM
  • Joined: 25 Aug 2005

It supposed to open submenus with recent files, and selecting one should launch it in the corresponding application.


...not working in win xp pro :(
________
GLAS

Laszlo
  • Moderators
  • 4713 posts
  • Last active: Mar 31 2012 03:17 AM
  • Joined: 14 Feb 2005
Which version does not work (Recent = ...)? In XP Recent = %HOME%\Recent should work, unless you added (or implicitly included) #NoEnv to your script. In that case you could add a line "EnvGet Home, Home" to the beginning of your script.