用热键win+字母激活任务栏上的按钮[ahk] 您所在的位置:网站首页 脚本激活win10 用热键win+字母激活任务栏上的按钮[ahk]

用热键win+字母激活任务栏上的按钮[ahk]

2023-05-05 04:07| 来源: 网络整理| 查看: 265

用热键win+字母激活任务栏上的按钮[ahk] 原创

玉宽 2023-04-25 12:33:54 博主文章分类:AutoHotkey ©著作权

文章标签 bundle Shell sed 文章分类 Python 后端开发

©著作权归作者所有:来自51CTO博客作者玉宽的原创作品,请联系作者获取转载授权,否则将追究法律责任

;bug:热键请自行修改,发现按win+d win+l 等和系统热键冲突,可以改成空格键或Capslock键+字母

; File encoding: UTF-8 AutoHotkey 版本: 1.0.9.1 操作系统: Windows XP 脚本说明:Quick task switching with Win+[a,b,...,z] 脚本版本: v1.0 Timestamp:2012-12-20 14:12:56 */ ;改版by sunwind: ;~ 按win+-显示任务栏上按钮标号 ;~ 标号是用字母标识 ;~ 按win+字母 切换 ;~ 原版: ;Quick task switching with Win+[1,2,...,0] ;Win + 数字键 切换,用 Win - 可能看到任务栏标号,然后再 Win + 数字 切换 ;http://www.autohotkey.com/forum/viewtopic.php?t=41542&highlight=taskbar+order+switch #SingleInstance #WinActivateForce Build_hWndArray(26) Loop %g_bundleCount% { sym:=Chr(A_Index+96) Hotkey, #%sym%, %sym% } Return a: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return b: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return c: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return d: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return e: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return f: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return g: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return h: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return i: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return j: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return k: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return l: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return m: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return n: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return o: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return p: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return q: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return r: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return s: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return t: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return u: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return v: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return w: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return x: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return y: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return z: n:=Asc(A_ThisLabel)-96 FocusButton(n) Return ;WIN+- shows button numbers as tooltips. #-:: #NumpadSub:: ShowToolTips() SetTimer, RemoveToolTips, -1000 Return RemoveToolTips: Loop, 12 ToolTip,,,,%A_Index% Return ShowToolTips() { global g_bundleCount 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% text:=Chr(A_Index+96) 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 }

收藏 评论 分享 举报

上一篇:Lua简介:开发《魔兽争霸》和《愤怒的小鸟》的语言

下一篇:[ahk]右键菜单打开文件所在文件夹(快捷方式也适用)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有