autp

;Quick task switching with Win+[1,2,...,0]
;http://www.autohotkey.com/forum/viewtopic.php?t=41542&highlight=taskbar+order+switch
#SingleInstance
#WinActivateForce

Loop 10
{
n := A_Index-1
Hotkey, #%n%, Focus%n%
Hotkey, #Numpad%n%, Focus%n%
}
return

Focus1:
FocusButton(1)
return
Focus2:
FocusButton(2)
return
Focus3:
FocusButton(3)
return
Focus4:
FocusButton(4)
return
Focus5:

FocusButton(5)
return
Focus6:
FocusButton(6)
return
Focus7:
FocusButton(7)
return
Focus8:
FocusButton(8)
return
Focus9:
FocusButton(9)
return
Focus0:
FocusButton(10)
return

#-::
#NumpadSub::
ShowToolTips()
SetTimer, RemoveToolTips, -1000
Return

RemoveToolTips:
Loop, 10
ToolTip,,,,%A_Index%
Return

ShowToolTips()
{
global g_bundleCount
Build_hWndArray(10)

CoordMode, ToolTip, Screen
Loop, %g_bundleCount%
{
If A_Index < 5
continue

x := g_xs%A_Index%
y := g_ys%A_Index%
If A_Index = 10
text = 0
Else
text = %A_Index%

ToolTip, %text%, %x%, %y%, %A_Index%
}
}

Add_hWndToArray(gi, hWnd)
{
global
g_bundleSize%gi% := g_bundleSize%gi% + 1
local wi := g_bundleSize%gi%
g_hWnd%gi%_%wi% := hWnd 
}

AddBundle(gi)
{
global
g_bundleSize%gi% := 0
}

BundleSize(gi)
{
global
return g_bundleSize%gi%
}

Get_hWndFromArray(gi, wi)
{
global
return g_hWnd%gi%_%wi%
}

SetButtonTopLeftLoc(gi, x, y)
{
global
g_xs%gi% := x
g_ys%gi% := y
}

Build_hWndArray(maxBundleCount)
{
global g_bundleCount

WinGet, pidTaskbar, PID, ahk_class Shell_TrayWnd
hProc := DllCall("OpenProcess", "Uint", 0x38, "int", 0, "Uint", pidTaskbar)
pProc := DllCall("VirtualAllocEx", "Uint", hProc, "Uint", 0, "Uint", 32, "Uint", 0x1000, "Uint", 0x4)
idxTB := GetTaskSwBar()
SendMessage, 0x418, 0, 0, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd ; TB_BUTTONCOUNT
buttonCount := ErrorLevel

g_bundleCount := 0

Loop, %buttonCount%
{
SendMessage, 0x417, A_Index-1, pProc, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd ; TB_GETBUTTON

VarSetCapacity(btn, 32, 0)
DllCall("ReadProcessMemory", "Uint", hProc, "Uint", pProc, "Uint", &btn, "Uint", 32, "Uint", 0)

idn := NumGet(btn, 4)
Statyle := NumGet(btn, 8, "Char")
dwData := NumGet(btn, 12)
If Not dwData
dwData := NumGet(btn, 16, "int64")

DllCall("ReadProcessMemory", "Uint", hProc, "Uint", dwData, "int64P", hWnd:=0, "Uint", NumGet(btn,12) ? 4:8, "Uint", 0)

If Not hWnd ; group button, indicates the start of a group
{
If g_bundleCount >= %maxBundleCount%
Break

hidden := Statyle & 0x08 ; TBSTATE_HIDDEN
If Not hidden
{
grpCollapsed := true
g_bundleCount := g_bundleCount + 1
AddBundle(g_bundleCount)

GetTaskbarButtonTopLeft(idn, x, y)
SetButtonTopLeftLoc(g_bundleCount, x, y)
}
Else
grpCollapsed := false
}
else ; actual window button
{
If grpCollapsed
{
Add_hWndToArray(g_bundleCount, hWnd)
}
Else
{
g_bundleCount := g_bundleCount + 1
AddBundle(g_bundleCount)
Add_hWndToArray(g_bundleCount, hWnd)

GetTaskbarButtonTopLeft(idn, x, y)
SetButtonTopLeftLoc(g_bundleCount, x, y)
}
}
}

DllCall("VirtualFreeEx", "Uint", hProc, "Uint", pProc, "Uint", 0, "Uint", 0x8000)
DllCall("CloseHandle", "Uint", hProc)
}

FocusButton(n)
{
global g_bundleCount

; these static variables can become inaccurate if windows are created or closed
; inbetween pressing of hotkeys, but in practice, we can safely ignore the
; inaccuracy
static prevBundleIndex := 0
static prevWindowIndex := 0

Build_hWndArray(n)

if (g_bundleCount >= n)
{
bundleSize := BundleSize(n)

if n = %prevBundleIndex%
windowIndex := Mod(prevWindowIndex, bundleSize) + 1
else
windowIndex := 1

hWnd := Get_hWndFromArray(n, windowIndex)

If bundleSize > 1 ; cycle through windows in the same bundle
WinActivate, ahk_id %hWnd%
Else ; single-window bundle; toggles between activating (restoring) and minimizing the window
IfWinActive, ahk_id %hWnd%
WinMinimize, ahk_id %hWnd%
Else
WinActivate, ahk_id %hWnd%

prevBundleIndex := n
prevWindowIndex := windowIndex
}
}

GetTaskSwBar()
{
ControlGet, hParent, hWnd,, MSTaskSwWClass1 , ahk_class Shell_TrayWnd
ControlGet, hChild , hWnd,, ToolbarWindow321, ahk_id %hParent%
Loop
{
ControlGet, hWnd, hWnd,, ToolbarWindow32%A_Index%, ahk_class Shell_TrayWnd
If Not hWnd
Break
Else If hWnd = %hChild%
{
idxTB := A_Index
Break
}
}
Return idxTB
}

GetTaskbarButtonTopLeft(id, ByRef x, ByRef y)
{
idxTB := GetTaskSwBar()
WinGet, pidTaskbar, PID, ahk_class Shell_TrayWnd
hProc := DllCall("OpenProcess", "Uint", 0x38, "int", 0, "Uint", pidTaskbar)
pProc := DllCall("VirtualAllocEx", "Uint", hProc, "Uint", 0, "Uint", 32, "Uint", 0x1000, "Uint", 0x4)
idxTB := GetTaskSwBar()

SendMessage, 0x433, id, pProc, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd ; TB_GETRECT
;IfEqual, ErrorLevel, 0, return "Err: can't get rect"

VarSetCapacity(rect, 32, 0)
DllCall("ReadProcessMemory", "Uint", hProc, "Uint", pProc, "Uint", &rect, "Uint", 32, "Uint", 0)

DllCall("VirtualFreeEx", "Uint", hProc, "Uint", pProc, "Uint", 0, "Uint", 0x8000)
DllCall("CloseHandle", "Uint", hProc)

ControlGet, hWnd, hWnd,, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd
WinGetPos, x, y, w, h, ahk_id %hWnd%

left := NumGet(rect, 0)
top := NumGet(rect, 4)
right := NumGet(rect, 8)
bottom := NumGet(rect, 12)

x := x + left
y := y + top
}

 

 

 javascript:alert(document.documentMode);

posted on 2012-12-11 23:31  紫雨心  阅读(441)  评论(0)    收藏  举报

导航