AutoHotkey Homepage AutoHotkey Community
Let's help each other out
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Quick Launch like Vista

 
Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions
View previous topic :: View next topic  
Author Message
bobbo



Joined: 19 Mar 2007
Posts: 15

PostPosted: Mon Mar 19, 2007 2:06 pm    Post subject: Quick Launch like Vista Reply with quote

Windows Vista adds shortcuts for each icon on the Quick Launch Toolbar (Win+1, Win+2, etc. in icon order). See this Lifehacker article:
http://lifehacker.com/software/windows-vista/windows-vista-tip--builtin-quick-launch-keyboard-shortcuts-229787.php

EDIT: Version 2.0 released. Scroll down to see the posting.
(It's considerably more complicated than this first version, so I'm leaving v1.0 here for non-XP users.)

Seemed like a logical thing to do, so I wrote a quick ahk script that will work on any flavor of Windows:
Code:
#1::Send #{tab}{tab}{enter}
#2::Send #{tab}{tab}{right}{enter}
#3::Send #{tab}{tab}{right 2}{enter}
#4::Send #{tab}{tab}{right 3}{enter}
#5::Send #{tab}{tab}{right 4}{enter}
#6::Send #{tab}{tab}{right 5}{enter}
#7::Send #{tab}{tab}{right 6}{enter}
#8::Send #{tab}{tab}{right 7}{enter}
#9::Send #{tab}{tab}{right 8}{enter}

This assumes that the quicklaunch is the left-most toolbar (next to the start button), enabled, & all the buttons are visible, so YMMV. It's this way by default on most users systems, so I didn't bother to add this checking. Enjoy.


Last edited by bobbo on Fri Mar 23, 2007 2:59 pm; edited 2 times in total
Back to top
View user's profile Send private message
TheIrishThug



Joined: 19 Mar 2006
Posts: 419

PostPosted: Mon Mar 19, 2007 2:34 pm    Post subject: Reply with quote

Windows 2000 Pro
Works just like you described, but with the tray menu, not quick launch.

Also, the following alteration changed it to programs in the task bar. Not sure why it differs, just letting you know.
Code:
#1::Send #{tab 2}{enter}
Back to top
View user's profile Send private message Visit poster's website AIM Address
bobbo



Joined: 19 Mar 2007
Posts: 15

PostPosted: Mon Mar 19, 2007 3:13 pm    Post subject: Reply with quote

It's simply sending a sequence of keys to get to the icon. Here's the order:

1. win-tab selects the taskbar
2. tab selects the first toolbar
3. arrow keys select the icon
4. enter executes the icon

So if your toolbars are in a different order/location, tweak the number of tabs in step 2. And if you have your icons vertically stacked, tweak the arrow keys in step 3.

A more robust solution would look like this:

1. WinActivate taskbar
2. WinGetText to determine quicklaunch control name (e.g. ToolbarWindow323), then ControlFocus to active it
3. ImageSearch to find the button in order
4. Run the found shortcut

Any volunteers to code this? The simple solution I originally posted works well enough for me.
Back to top
View user's profile Send private message
TheIrishThug



Joined: 19 Mar 2006
Posts: 419

PostPosted: Mon Mar 19, 2007 3:30 pm    Post subject: Reply with quote

Hmmm. My Win+Tab selects the Taskbar. Then tabs from there move to the next thing to the right. Which in my case is the Tray Menu, since my Quick launch is all the way to the left next to the start button.
Back to top
View user's profile Send private message Visit poster's website AIM Address
jonny



Joined: 13 Nov 2004
Posts: 2951
Location: Minnesota

PostPosted: Mon Mar 19, 2007 4:50 pm    Post subject: Reply with quote

Try Shift-Tab then.
Back to top
View user's profile Send private message
bobbo



Joined: 19 Mar 2007
Posts: 15

PostPosted: Fri Mar 23, 2007 1:31 pm    Post subject: Version 2.0 Reply with quote

OK, so I went ahead and coded that more robust version. This uses Windows API commands (SendMessage, PostMessage, DLLCall) to find the Quick Launch toolbar, find the desired button, then execute it.

EDIT: This only works on XP, Win2k apparently uses a whole different taskbar structure.
(see http://w-shadow.com/blog/2006/10/01/manipulating-taskbar-buttons/)

Code:
; Quick Launch using Win+Number Hotkey (like Windows Vista)
; v2.0
;
; AutoHotkey Version: 1.0.46.09 (tested version)
; Language:       English
; Platform:       Win9x/NT
; Author:         Bobbo
;
; Script Function:
;   Added win+num(0:9) as shortcut keys to whatever is in your quicklaunch toolbar
;   (just like Windows Vista)
;

#NoEnv
SendMode Input

#1::WinNumQL(1)
#2::WinNumQL(2)
#3::WinNumQL(3)
#4::WinNumQL(4)
#5::WinNumQL(5)
#6::WinNumQL(6)
#7::WinNumQL(7)
#8::WinNumQL(8)
#9::WinNumQL(9)

WinNumQL(button_num)
{
   ; do nothing if toolbar not loaded
   WinGetText, text, ahk_class Shell_TrayWnd
   if (InStr(text, "Quick Launch") = 0)
      return

   ; find the control name of the Quick Launch toolbar
   Loop,9
   {   
      ControlGetText,text2,ToolbarWindow32%A_Index%, ahk_class Shell_TrayWnd
      IfInString,text2,Quick Launch
      {
         qlname = ToolbarWindow32%A_Index%
         break
      }
   }

   ; do nothing if not enough buttons
   SendMessage, 0x418, 0, 0, %qlname%, ahk_class Shell_TrayWnd   ; TB_BUTTONCOUNT
   if (ErrorLevel<button_num)
      return

   ; get info about the requested button
   WinGet, pid, PID, ahk_class Shell_TrayWnd
   hProc := DllCall("OpenProcess", "Uint", 0x38, "int", 0, "Uint", pid)
   pRB := DllCall("VirtualAllocEx", "Uint", hProc, "Uint", 0, "Uint", 20, "Uint", 0x1000, "Uint", 0x4)
   VarSetCapacity(btn, 20)
   VarSetCapacity(nfo, 24)
   SendMessage, 0x417, button_num-1, pRB, %qlname%, ahk_class Shell_TrayWnd   ; TB_GETBUTTON
   DllCall("ReadProcessMemory", "Uint", hProc, "Uint", pRB, "Uint", &btn, "Uint", 20, "Uint", 0)
      iBitmap := DecodeInteger(&btn + 0)
      idn     := DecodeInteger(&btn + 4)
      dwData  := DecodeInteger(&btn +12)
      iString := DecodeInteger(&btn +16)
   DllCall("ReadProcessMemory", "Uint", hProc, "Uint", dwData, "Uint", &nfo, "Uint", 24, "Uint", 0)
      hWnd  := DecodeInteger(&nfo + 0)
      uID   := DecodeInteger(&nfo + 4)
      nMsg  := DecodeInteger(&nfo + 8)
      hIcon := DecodeInteger(&nfo +20)

   ; execute the button
   ControlGet,qlhandle,Hwnd,,%qlname%, ahk_class Shell_TrayWnd
   PostMessage, 0x111, idn, qlhandle, %qlname%, ahk_class Shell_TrayWnd  ; WM_COMMAND
   return
}

DecodeInteger(ptr)
{
   Return *ptr | *++ptr << 8 | *++ptr << 16 | *++ptr << 24
}

EncodeInteger(ref, val, nSize = 1)
{
   DllCall("ntdll\RtlFillMemoryUlong", "Uint", ref, "Uint", nSize * 4, "Uint", val)
}


Theoretically this should be more reliable than the first version, because it doesn't rely on windows shortcut keys & moving the cursor focus.

Thanks to Sean (http://www.autohotkey.com/forum/viewtopic.php?t=17314) for his code for extracting button info.

Also check out how I execute the button using WM_COMMAND: it looks simple, but it took me a lot of googling to figure it out. You can use this method to execute any toolbar button in any application without using screen coordinates and simulated mouse clicks. This is especially important if only part of the menu is visible on the screen (e.g. some of your buttons are only accessible by a drop-down menu, because the toolbar is too short to display them all.).
Back to top
View user's profile Send private message
supergrass



Joined: 21 Feb 2007
Posts: 51
Location: Australia

PostPosted: Tue Jul 29, 2008 12:34 am    Post subject: #1 ejects CD! Reply with quote

Hi I have been using your script and I like it.

For some reason Win+1 opens the CD drive. Shocked All other quick launches work as expected.

Has anyone else found this?

(I am using the complicated XP only version)
Back to top
View user's profile Send private message
Jester_AG
Guest





PostPosted: Tue Jan 06, 2009 8:20 pm    Post subject: scritps Reply with quote

what application are you useing to compile and run this script?
Back to top
pemiam
Guest





PostPosted: Mon Jun 22, 2009 1:27 am    Post subject: awesome works for me Reply with quote

great, works for me, thanks
Back to top
pemiam
Guest





PostPosted: Mon Jun 22, 2009 1:31 am    Post subject: works for me on Windows XP Reply with quote

thanks, exactly what I was looking for Smile

Before the upgrade, I was doing it hard-coded:
Code:
;#1::Run "C:\Documents and Settings\HP_Administrator\Local Settings\Application Data\Google\Chrome\Application\chrome.exe"
;#2::Run "C:\Program Files\Microsoft Office\Office12\OUTLOOK.EXE"  /recycle
;#4::Run "%SystemRoot%\system32\mstsc.exe"

... etc

But your version is better

I also appreciate that you posted the old version too, since the less-robust version is very few lines of code... Though I am using the newer version.

http://www.mepem.com/pemtech
Back to top
chessonly



Joined: 06 Feb 2005
Posts: 26

PostPosted: Thu Jan 14, 2010 1:23 pm    Post subject: Reply with quote

can someone modify this script so that instead of launching another instance of an application, the win+# hotkey activates an existing instance of the application?
Back to top
View user's profile Send private message
aaffe



Joined: 17 May 2007
Posts: 1002
Location: Germany - Deutschland

PostPosted: Thu Jan 14, 2010 3:03 pm    Post subject: Reply with quote

Why not doing it by yourself? Youre a forum member since 2005, so this should be no problem for you.
chessonly wrote:
can someone modify this script so that instead of launching another instance of an application, the win+# hotkey activates an existing instance of the application?
Back to top
View user's profile Send private message
chessonly



Joined: 06 Feb 2005
Posts: 26

PostPosted: Thu Jan 14, 2010 4:49 pm    Post subject: Reply with quote

^Fair enough. i guess i could try.. almost everything in the script is greek to me though. could give it a try
Back to top
View user's profile Send private message
chessonly



Joined: 06 Feb 2005
Posts: 26

PostPosted: Thu Jan 14, 2010 5:48 pm    Post subject: Reply with quote

OK i gave it a shot.
Code:

if WinExist("ahk_class classname")
{
WinActivate
}
else
{
;execute code
}

now only 'classname' needs to be replaced by the classname of the quick launch button.
but how to find it , without opening the application ?
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions All times are GMT
Page 1 of 1

 
Jump to:  
You can post new topics in this forum
You can reply to topics in this forum


Powered by phpBB © 2001, 2005 phpBB Group