web-dev-qa-db-ja.com

AhkでAlt + Tabを送信する正しい方法は何ですか?

OK。これは非常に愚かな質問です。しかし、私はすでに1時間立ち往生しています。

Ahkの経験はほとんどありませんでしたが、これまですべてのスクリプトを問題なく動作させました。私はahkチュートリアルを調べましたが、今のところ解決策は見つかりませんでした。

Prevに切り替えようとしています。テンキーオフキーが1つあるアプリ。私はもう試した:

!{Tab}

{Alt down}{Tab}{Alt up}

私は、スリープ遅延、複数行、括弧内の複数行、コマンドの後のコンマの有無にかかわらず、それを試しました。

とてもシンプルだと確信していますが、まだ試していません。

なにか提案を?

18
user5835566
$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
}

[〜#〜] edit [〜#〜](ユーザーが推奨Ooker =):

スクリプトは、選択するメニューをポップアップします。

これは次のようになります。

15
user3419297

前のアプリケーションに戻すだけの場合は、送信、!{Esc}を使用します。

6
Robert Ilbrink

Alt + tabは特別なWindowsコマンドであるため、手動で送信しないでください。代わりに AltTabコマンド を使用してください。

AltTabMenuはタブメニューを開いてプログラムを選択しますが、AltTabShiftAltTabはプログラムをナビゲートします。

h::AltTabMenu  
n::AltTab
m::ShiftAltTab
5
2501

Windows 8/10およびctrl-alt-delやalt-tabなどのキーにはいくつかの問題があります。ここに1つの解決策があります:

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
4
Stepan

私のために働いた:

F1::
Send, {ALT DOWN}{TAB}{ALT UP}
return

F1キーのAlt + Tab動作をシミュレートします。

3
JerryGoyal

さて、最後に私は理由といくつかの「解決策」 here および here を見つけました。 Windows 8がAhk {Alt Down} {Tab}とAltTabMenuといくつかの他のキーをブロックしているようです。

今のところ、これを使用してウィンドウを前方にスクロールします。

Send !{ESC} 

これは、AltTabMenuを表示します。

Run, "C:\Users\Default\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\Window Switcher.lnk"

そして、これはトピックの1つで提案されているように前のアプリに切り替えるためです:

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のスプラッシュなしで以前のアプリにアクセスできると便利です。

0
user5835566

!{Tab}は、前後にスリープを追加すると、ウィンドウを切り替えるように機能します。

  • スリープ100
  • 送信!{タブ}
  • スリープ100
0
hywin
send {Alt down}{tab}
send {Alt up}
0
Rupert Russell

複数の「タブ」を作成したい場合は、以下の関数を使用すると便利です。これは、私のWindows 8.1マシンでは少なくとも独自のソリューションでした。

アプローチは次のとおりです。

  • 1)すべてのウィンドウのリストを取得する
  • 2)ループ1:
    • 現在のウィンドウのインデックスを見つける
    • 切り替えるインデックスを( "current" + "offset")に設定します
  • 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
}
0
Jonas Nissen