2016-03-18 24 views
-1

Orta fare düğmesini kullanarak Windows 10 üzerinde Alt Sekmesi'ni simüle etmek için kısa bir AutoHotKey komut dosyası kullanıyorum, böylece en son açtığım uygulamayı hızlı bir şekilde açabilir veya iki düğme arasında geçiş yapabilir ve bir düğmeyi tıklayabilirsiniz. Bu benimACTIVE monitöründe en son açılan uygulamaya geçmek için AutoHotKey'i kullanın.

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

kullanıyorum Ama son zamanlarda iki monitör kullanıyorum ve ne gerçekten yapmak istiyorum AKTİF EKRANDAKİ en son açılan uygulamasına geçiş (veya monitör fare olduğunu budur şu anda açık.) Alt Tab tek başına çalışmaz, çünkü çoğu zaman en son açılan uygulama diğer monitörde ve sadece şu anda çalışmakta olduğum monitörde en son kullanılan uygulamanın penceresini getirmek istiyorum. Bu mümkün olup olmadığını ve bunu yapmak için nasıl gidebileceğimi bilen var mı?

+0

Her iki monitör için en son açılan iki pencere (iki monitör durumunda) pencerelerini izleyen bir komut dosyası yazabileceğinizi hayal edebiliyorum. Periyodik olarak kontrol eder ve günceller. Kısayol tuşuna basıldığında, geçerli monitörün, geçerli pencerenin ne olduğunu saptamalı ve ardından bu monitör için en son iki pencere listesini kontrol etmelidir. Birincisi o anda aktif olanla aynı ise, ikinciye geçer; değil - ikisinden ilkine. – stansult

+0

Teşekkürler, evet böyle bir şey işe yarayabileceğini düşündüğüm şey. Sorun şu ki, sıfırdan yapamam! Uyum sağlayabileceğim bir şey bulmayı umuyordum, ama henüz yapmadım. – omaxio

+0

Bu basit olmayacak. Pencerenin hangi ekranda olduğunu kontrol edebilirsiniz: http://stackoverflow.com/questions/34338637/determining-which-screen-a-window-is-on-by-checking-where-the-most-surfacearea – Forivin

cevap

0

Buraya komutumu yapıştırıyorum. Çok çirkin, ama iki monitörlü kurulumda anlattığın gibi çalışıyor: önceki pencereye geçiyor (ortadaki düğmeyi tıkladığınız monitör için). işlevleri (GetMonitorIndexFromWindow(windowHandle)) arasında

#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 
} 

bir mine, from here alınan değildir.

GetMonitorIndexFromMouse() işlevim için genel durumda çalışma zamanım olmadığına dikkat edin, bu yüzden yalnızca özel durumum için iyi (2 monitör, soldaki gibi birincil).

isDebug := true Burada, değişkenlerle araç ipucunu görebilmeniz için - script sizin için çalışıyorsa, elbette isDebug := false'a değiştirmek için çekinmeyin.

+1

Cool, bunu yapmak için zaman ayırdığınız için teşekkürler! – omaxio

+0

Sorun değil, eğlenceliydi :) – stansult