Каков правильный способ отправить Alt + Tab в Ahk?
Ok. Я знаю, что это очень глупый вопрос.
Но я застрял уже в течение часа.
У меня очень мало опыта работы с ahk, но до сих пор я работал с каждым script без проблем. Я изучил учебники ahk, но не нашел решения до сих пор.
Я пытаюсь переключиться на prev. приложение с одним нажатием клавиши numpad.
Я пробовал:
!{Tab}
{Alt down}{Tab}{Alt up}
Я пробовал это с задержками сна, многострочными, многострочными внутри скобок, с запятыми и без запятых после команд и т.д.
Я уверен, что это очень просто, но я еще не пробовал.
Любое предложение?
Ответы
Ответ 1
$F1:: AltTab()
$F2:: AltTabMenu()
; AltTab-replacement for Windows 8:
AltTab(){
list := ""
WinGet, id, list
Loop, %id%
{
this_ID := id%A_Index%
IfWinActive, ahk_id %this_ID%
continue
WinGetTitle, title, ahk_id %this_ID%
If (title = "")
continue
If (!IsWindow(WinExist("ahk_id" . this_ID)))
continue
WinActivate, ahk_id %this_ID%, ,2
break
}
}
; AltTabMenu-replacement for Windows 8:
AltTabMenu(){
list := ""
Menu, windows, Add
Menu, windows, deleteAll
WinGet, id, list
Loop, %id%
{
this_ID := id%A_Index%
WinGetTitle, title, ahk_id %this_ID%
If (title = "")
continue
If (!IsWindow(WinExist("ahk_id" . this_ID)))
continue
Menu, windows, Add, %title%, ActivateTitle
WinGet, Path, ProcessPath, ahk_id %this_ID%
Try
Menu, windows, Icon, %title%, %Path%,, 0
Catch
Menu, windows, Icon, %title%, %A_WinDir%\System32\SHELL32.dll, 3, 0
}
CoordMode, Mouse, Screen
MouseMove, (0.4*A_ScreenWidth), (0.35*A_ScreenHeight)
CoordMode, Menu, Screen
Xm := (0.25*A_ScreenWidth)
Ym := (0.25*A_ScreenHeight)
Menu, windows, Show, %Xm%, %Ym%
}
ActivateTitle:
SetTitleMatchMode 3
WinActivate, %A_ThisMenuItem%
return
;-----------------------------------------------------------------
; Check whether the target window is activation target
;-----------------------------------------------------------------
IsWindow(hWnd){
WinGet, dwStyle, Style, ahk_id %hWnd%
if ((dwStyle&0x08000000) || !(dwStyle&0x10000000)) {
return false
}
WinGet, dwExStyle, ExStyle, ahk_id %hWnd%
if (dwExStyle & 0x00000080) {
return false
}
WinGetClass, szClass, ahk_id %hWnd%
if (szClass = "TApplication") {
return false
}
return true
}
РЕДАКТИРОВАТЬ (предложено пользователем Ooker):
Сценарий выскакивает меню для вас, чтобы выбрать.
Вот как это выглядит:
![]()
Ответ 2
Не следует вручную отправлять alt + tab, так как это специальная команда для Windows, а используйте команды AltTab, которые делают это за вас.
AltTabMenu
открывает меню вкладок и выбирает программу, а AltTab
, ShiftAltTab
перемещаются по ней.
h::AltTabMenu
n::AltTab
m::ShiftAltTab
Ответ 3
Если вы просто хотите вернуться к предыдущему приложению, используйте Send,! {Esc}
Ответ 4
Есть некоторые проблемы с Windows 8/10 и такими ключами, как ctrl-alt-del и alt-tab. Вот одно из решений:
F1::
{
Send {Alt Down}{Tab} ;Bring up switcher immediately
KeyWait, F1, T.5 ; Go to next window; wait .5s before looping
if (Errorlevel)
{
While ( GetKeyState( "F1","P" ) ) {
Send {Tab}
Sleep, 400 ; wait 400ms before going to next window
}
}
Send {Alt Up} ;Close switcher on hotkey release
}
return
Ответ 5
Работал для меня:
F1::
Send, {ALT DOWN}{TAB}{ALT UP}
return
Он имитирует поведение Alt + Tab для клавиши F1.
Ответ 6
Ну, наконец, я нашел причину и некоторые "решения" здесь и .
Кажется, что Windows 8 блокирует Ahk {Alt Down} {Tab} и AltTabMenu и некоторые другие ключи.
Теперь я использую это для прокрутки окон вперед:
Send !{ESC}
Для отображения AltTabMenu:
Run, "C:\Users\Default\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\Window Switcher.lnk"
И это, чтобы перейти к предыдущему приложению, как предложено в одной из тем:
LCtrl & z:: ; AltTabMenu
state := GetKeyState("Capslock", "T")
if state = 1
SetCapsLockState, Off ; CapsLock On blocks Task Switching metro window
Send, !{Tab} ; prevents displaying inactive Task Switching metro window
run, Window Switcher.lnk ; must be in script directory otherwise include path
WinWait, Task Switching,, 2
KeyWait, Ctrl
Send, {Enter}
if state = 1
SetCapsLockState, On ; restores CapsLock State
state =
return
#IfWinActive, Task Switching
LCtrl & q::Send, {Right}
LCtrl & a::Send, {Left}
Было бы здорово попасть в предыдущее приложение без всплеска AltTabMenu.
Ответ 7
Если вы хотите сделать несколько "вкладок", то следующая функция должна помочь в этом. Это было по крайней мере собственное решение на моем компьютере с Windows 8.1.
Подход такой:
- 1) Получить список всех окон
- 2) Петля 1:
- найти индекс текущего окна
- установить индекс для переключения ("текущий" + "смещение")
- 3) Цикл 2:
- цикл, пока вы не нажмете индекс для переключения, затем переключите окно
Пример кода AutoHotKey ниже:
; Test switch of 1 window
F1::AltTabFunction(offset:=1)
; Test switch of 2 windows
F2::AltTabFunction(offset:=2)
AltTabFunction(offset:=1)
{
; ****************************
; Function for switching windows by ALT-TAB (offset = number of windows to "tab")
; ****************************
; Get list of all windows.
WinGet, AllWinsHwnd, List
WinGetTitle, active_title, A ; Get title of active window.
; Find index of the current window.
counter_of_none_hidden_windows := 0 ; Initiate counter for counting only the none-hidden windows.
Loop, % AllWinsHwnd
{
; Find title for window in this loop.
WinGetTitle, CurrentWinTitle, % "ahk_id " AllWinsHwnd%A_Index%
; From [1]: "Retrieves an 8-digit hexadecimal number representing the extended style of a window.".
; [1] : https://autohotkey.com/docs/commands/WinGet.htm
WinGet, exStyle, exStyle, % "ahk_id" AllWinsHwnd%A_Index%
; Skip hidden windows by checking exStyle.
If !(exStyle & 0x100){
Continue
}
; Window is not hidden. Increase counter.
counter_of_none_hidden_windows := counter_of_none_hidden_windows+1
; Set flag.
titles_match := CurrentWinTitle = active_title
If (titles_match) {
window_index_to_switch_to := counter_of_none_hidden_windows+offset
break
}
}
; Find index of the window to switch to and do the actual switch
counter_of_none_hidden_windows := 0 ; Initiate counter for counting only the none-hidden windows.
Loop, % AllWinsHwnd
{
; From [1]: "Retrieves an 8-digit hexadecimal number representing the extended style of a window.".
; [1] : https://autohotkey.com/docs/commands/WinGet.htm
WinGet, exStyle, exStyle, % "ahk_id" AllWinsHwnd%A_Index%
; Skip hidden windows by checking exStyle.
If !(exStyle & 0x100){
Continue
}
; Window is not hidden. Increase counter.
counter_of_none_hidden_windows := counter_of_none_hidden_windows+1
; Set flag.
found_window_to_switch_to := counter_of_none_hidden_windows = window_index_to_switch_to
; Switch window.
If (found_window_to_switch_to) {
; Get title.
WinGetTitle, CurrentWinTitle, % "ahk_id " AllWinsHwnd%A_Index%
; Activate by title.
WinActivate, %CurrentWinTitle%
; Stop loop.
break
}
}
return ; Nothing to return
}
Ответ 8
send {Alt down}{tab}
send {Alt up}
Ответ 9
! {Tab} позволяет переключаться между окнами, если вы добавляете спящий режим до и после него.
- Сон 100
- Отправить! {Tab}
- Сон 100