2016-03-18 26 views
-1

Ich habe ein kurzes AutoHotKey-Skript verwendet, um Alt Tab unter Windows 10 mit der mittleren Maustaste zu simulieren, so dass ich meine zuletzt geöffnete App schnell öffnen oder mit einem Klick zwischen zwei Apps wechseln kann. Das ist, was ichVerwenden Sie AutoHotKey, um zur zuletzt geöffneten App im ACTIVE-Monitor zu wechseln?

Mbutton::SendEvent {Alt Down}{Tab}{Alt Up} 

verwenden, aber ich habe vor kurzem zwei Monitore benutzen, und was ich will wirklich tun Schalter auf die zuletzt geöffnete App auf dem aktiven Monitor (oder der Monitor, dass die Maus ist gerade an). Alt Tab alleine funktioniert offensichtlich nicht, weil oft die zuletzt geöffnete App auf dem anderen Monitor ist und ich nur das Fenster der zuletzt verwendeten App nach vorne bringen möchte, wenn es auf dem Monitor ist, auf dem ich gerade arbeite Weiß jemand, ob das möglich ist und wie ich das machen könnte?

+0

Ich kann mir vorstellen, dass Sie ein Skript schreiben können, das IDs von vier (im Falle von zwei Monitoren) Windows verfolgt - zwei zuletzt geöffneten Fenster für jeden Monitor. Es überprüft und aktualisiert sie regelmäßig. Wenn Hotkey gedrückt wird, sollte es erkennen, was aktueller Monitor ist, aktuelles Fenster, und überprüfen Sie dann die zwei letzten Windows-Liste für diesen Monitor. Wenn der erste mit dem aktuell aktiven identisch ist, würde er zum zweiten wechseln; von nicht - zum ersten der beiden. – stansult

+0

Danke, ja, so etwas könnte meiner Meinung nach funktionieren. Problem ist, ich kann es nicht von Grund auf neu machen! Ich hatte gehofft, etwas online zu finden, das ich anpassen könnte, aber noch nicht. – omaxio

+0

Das wird nicht einfach sein. Hier können Sie überprüfen, auf welchem ​​Bildschirm sich ein Fenster befindet: http://stackoverflow.com/questions/34338637/determining-which-screen-a-window-is-on-bycking-where-the-most-surfacearea – Forivin

Antwort

0

Ich paste hier mein Skript. Es ist sehr hässlich, aber es funktioniert auf meinem Zwei-Monitor-Setup wie beschrieben: schaltet auf das vorherige (für den Monitor, wo Sie auf die mittlere Taste klicken) aktives Fenster.

#WinActivateForce 
#SingleInstance 
#Persistent 

CoordMode, Mouse, Screen 
CoordMode, ToolTip, Screen 

DetectHiddenWindows, On 
SetTitleMatchMode , 2 
SetBatchLines , -1 
SetWorkingDir %A_ScriptDir% 

Thread, interrupt, 0 
SetTimer, UpdateCurrentWindow, 100 

isDebug := true 

SysGet, monitors_total, MonitorCount 
SysGet, monitor_primary, MonitorPrimary 

Hotkey, MButton, SwitchToLastWindow, On 

return 


SwitchToLastWindow: 

WinGet, active_id, ID, A 

Loop , %monitors_total% 
{ 
    if (A_Index != current_monitor) 
     continue 

    switch_to_window := (active_id = winlast%A_Index%) 
         ? winprelast%A_Index% 
         : winlast%A_Index% 
} 

WinActivate , ahk_id %switch_to_window% 

return 



UpdateCurrentWindow: 

WinGet, active_id, ID, A 
monitor_index := GetMonitorIndexFromWindow(active_id) 

current_monitor := GetMonitorIndexFromMouse() 

if (monitor_index > monitors_total) 
    monitors_total := monitor_index 

if (winlast%monitor_index% != active_id) 
{ 
    winprelast%monitor_index% := winlast%monitor_index% 
    winlast%monitor_index% := active_id 
} 

if isDebug 
{ 
    DebugToolTip := "" 
    Loop , %monitors_total% 
    { 
     DebugToolTip .= "Monitor # " . A_Index 
        . ":`n`nLast window: " . winlast%A_Index% 
        . "`nPre-last window: " . winprelast%A_Index% . "`n`n" 
    } 

    MouseGetPos, xpos, ypos 
    DebugToolTip .= "x: " . xpos . "`ny: " . ypos . "`ncurrent_monitor: " . current_monitor 
       . "`n`nA_ScreenHeight: " . A_ScreenHeight . "`nA_ScreenWidth: " . A_ScreenWidth 
       . "`n`nmonitors_total: " . monitors_total . "`nmonitor_primary: " . monitor_primary 

    ToolTip , %DebugToolTip%, 10, 10 
} 

return 


; only done for one case: total 2 monitors, monitor to the left is primary 
; need to redo for the generic case 

GetMonitorIndexFromMouse() 
{ 
    SysGet, monitors_total, MonitorCount 
    SysGet, monitor_primary, MonitorPrimary 
    MouseGetPos, xpos, ypos 
    current_monitor := (xpos > A_ScreenWidth) ? 2 : 1 

    return current_monitor 
} 


; this function is from autohotkey.com/board/topic/69464-how-to-determine-a-window-is-in-which-monitor/?p=440355 

GetMonitorIndexFromWindow(windowHandle) 
{ 
    ; Starts with 1. 
    monitorIndex := 1 

    VarSetCapacity(monitorInfo, 40) 
    NumPut(40, monitorInfo) 

    if (monitorHandle := DllCall("MonitorFromWindow", "uint", windowHandle, "uint", 0x2)) 
     && DllCall("GetMonitorInfo", "uint", monitorHandle, "uint", &monitorInfo) 
    { 
     monitorLeft := NumGet(monitorInfo, 4, "Int") 
     monitorTop := NumGet(monitorInfo, 8, "Int") 
     monitorRight := NumGet(monitorInfo, 12, "Int") 
     monitorBottom := NumGet(monitorInfo, 16, "Int") 
     workLeft  := NumGet(monitorInfo, 20, "Int") 
     workTop  := NumGet(monitorInfo, 24, "Int") 
     workRight  := NumGet(monitorInfo, 28, "Int") 
     workBottom := NumGet(monitorInfo, 32, "Int") 
     isPrimary  := NumGet(monitorInfo, 36, "Int") & 1 

     SysGet, monitorCount, MonitorCount 

     Loop, %monitorCount% 
     { 
      SysGet, tempMon, Monitor, %A_Index% 

      ; Compare location to determine the monitor index. 
      if ((monitorLeft = tempMonLeft) and (monitorTop = tempMonTop) 
       and (monitorRight = tempMonRight) and (monitorBottom = tempMonBottom)) 
      { 
       monitorIndex := A_Index 
       break 
      } 
     } 
    } 

    return monitorIndex 
} 

Eine der Funktionen (GetMonitorIndexFromWindow(windowHandle)) ist nicht mein, genommen from here.

Beachten Sie, dass ich keine Zeit habe, an generischen Fall für meine GetMonitorIndexFromMouse() Funktion zu arbeiten, so ist es nur gut für meinen speziellen Fall (2 Monitore, mit dem linken als primäre).

Ich habe isDebug := true hier, so dass Sie den Tooltip mit Variablen sehen können - fühlen Sie sich frei, es zu isDebug := false natürlich zu ändern, wenn das Skript für Sie arbeitet.

+1

Cool, danke, dass du dir die Zeit genommen hast, das zu tun !! – omaxio

+0

Kein Problem, es hat Spaß gemacht :) – stansult