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.
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
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
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