bir programı geri yüklemek / önüne getirmek veya etkin değilse açmak için komut dosyası


11

Aşağıdakileri yapması gereken bir komut dosyası geliştirmeye çalışıyorum. Örneğin !W:

  • Word'ün etkin olup olmadığını kontrol edin (açık veya simge durumuna küçültülebilir)
  • simge durumuna küçültülmüşse, simge durumuna küçültmeden önceki boyutuna ve konumuna geri yüklenmelidir
  • açık, ancak diğer açık pencerelerin arkasında "gizli" ise, komut dosyası ön tarafa getirmeli ve en ön / etkin pencere haline getirilmelidir.
  • Eğer simge durumuna küçültülmüş veya açılmamışsa, program yeni başlatılmalıdır

Bunu birkaç program için yapmak istiyorum: !WWord !Niçin, Notepad ++ !Xiçin, excel !Piçin, powerpoint !Fiçin, Firefox için.

Bir programın birden çok örneği çalışıyorsa veya birden çok sekme varsa, en son örnek veya sekme için yukarıdaki işlemi yapmalıdır. Bu nedenle, birden fazla Firefox penceresi açıldığında, en son açılan sekmeyi içeren en son görüntülenen pencereyi geri yüklemeli (veya öne getirmelidir). Benzer şekilde, birden fazla word belgesi açıksa, bunu en son üzerinde çalıştığım belge için yapmalıdır. Ve hiçbir Word belgesi açık veya simge durumuna küçültülmüşse, yeni bir kelime örneği açmalıdır.

Bunlardan bazılarını bazı programlar için yapabilirim, ama tutarlı değil, ne de bir kısayol tuşunda (hala kodlama dilini öğreniyorum). Bunu nasıl başarabilirim?

Yanıtlar:


14

Pencere Etkinleştirmenin nasıl çalıştığına ilişkin anlayışım oldukça basit. Bu türün en son kullanılan penceresini geri yükler. Bu varsayılan davranış, kodlamayı çok basit hale getirir. Aslında, iki basit kod bloğu ile neyin peşindeyim ile neredeyse aynı bir şey yapıyorum.

+#w::
SetTitleMatchMode, 2 ; approximate match
IfWinExist, - Microsoft Word
{
WinActivate, - Micrsoft Word
}
IfWinNotExist, - Microsoft Word
{
Run FullFilePathToMicrosoftWord
}
return

Birden fazla monitörle çalışmak için biraz ilginç bir sinerji yarattım. Windows 7'de, shift + windows tuşunu basılı tutmanın ve sola ve sağa gitmek için okları kullanmanın etkin pencereyi ışık hızında monitörler arasında taşıyacağını unutmayın. Bu yüzden biraz akıllıca bir şey denedim ve shift + window + w kelimesini eşledim. Zaten açıksa sözcüğü geri yükler veya değilse yeni bir örnek çalıştırır. Yaklaşımın güzelliği, shift + windows tuşunu asla bırakmam. Bunu yaparak, hem sağ / sol kelimeyi aktif / başlangıç ​​yapabilir ve tam olarak istediğim konuma taşıyabilirim (yukarı bu arada en üst düzeye çıkar, aşağı en aza indirir). Etkin pencereyi geri yüklemek için + # r eşlemesini yapın ve normalde faresiz olarak kullandığınız tüm pencereleri tamamen kontrol edin. Hatırlamanız gereken tek şey, etkinleştirmeye çalıştığınız uygulamanın ilk harfidir.

Komut dosyasını daha genel hale getirme sorgunuza yanıt olarak:

1) kullanmayı düşünün

; Allows you to search for an approximate window title match
SetTitleMatchMode, 2  

; For example, you could do the following to activate any existing window with 
; "- Microsoft Word" as part of the title

WinWait, - Microsoft Word, 
IfWinNotActive, - Microsoft Word, , WinActivate, - Microsoft Word, 
WinWaitActive, - Microsoft Word,

; some other code here once you have the window active

Veya başka bir olasılık:

;Active the window by finding its ahk_class
WinWait, ahk_class OpusApp, 
IfWinNotActive, ahk_class OpusApp, , WinActivate, ahk_class OpusApp, 
WinWaitActive, ahk_class OpusApp,

Not: Yukarıdaki kod, autoscriptwriter'ın genel çıktısının sadece bir uyarlamasıydı. Biraz gereksiz ama etkilidir. Bir pencerenin ahk_class gibi bir şey bulmak için AutoIt3 pencere casus kullanmayı düşünün.

Bir pencerenin başlığını keşfetmeniz gerekirse, ahk örneği yardım dosyasında gösterildiği gibi etkin başlık alabilirsiniz

WinGetActiveTitle, Title
MsgBox, The active window is "%Title%".

Kullanabileceğiniz bir başka numara, WinSetTitle'ı kullanarak etkin başlığı ayarlamaktır

Düzenleme: Etrafta yüzen excel / word / powerpoint birden çok örnekleri olduğu göz önüne alındığında, ayrıca officetabs ücretsiz sürümü ile bu sorunu çözmeyi düşünün. Tüm açık excel dosyalarını örneğin görev çubuğuna yayılmış yerine tek bir örnekte tutmanıza izin verir.


Bu harika! Harika ipuçları ve çok kullanışlı kod. İkinci bir monitör ekleyeceğim, böylece cevabın bir kısmı da çok takdir ediliyor.
Peter Verbeet

Bu arada, officetabs ipucunu da seviyorum. Var olduğunu bilmiyordum, ama çok faydalı görünüyor.
Peter Verbeet

Neyse ki, "Run, winword" komutu çalışıyor, bu yüzden tam yolu sağlamak zorunda değilim gibi görünüyor.
Peter Verbeet

@Coldrainwater: Google Chrome için çalışmasını sağlamak için yukarıdaki komut dosyanızı nasıl değiştirmeniz gerekir? Sorun, başlığın hangi web sitesinin açık olduğuna bağlı olarak değişmesidir.
Lernkurve

1

Gördüğünüz gibi muhteşem Otohotkey dilini zaten biliyorsunuz;). Kullanırım:

  • ifWinActive; pencerenin etkin olup olmadığını kontrol et
  • WinGet, çıktı, MinMax; pencerenin simge durumuna küçültülmüş olup olmadığını kontrol et
  • ifWinExists; pencerenin var olup olmadığını kontrol et (ama aktif değil)
  • Çalıştırmak ; herhangi bir işlem ilişkili değilse programı çalıştır
  • Z-sırası / WinList; bunlar tüm örnekleri listelemenize / hangisinin ilk örnek olduğunu belirlemenize yardımcı olur

Daha fazla sorunuz varsa, bunları autohotkey forumunda kesinlikle sormalısınız.

; The script activates a Word 2007 window
; The script uses 'winTitle' and 'winClass' variables to match the window
; so set those properly first.
; Press Shift + 1 + w to see how the script works.
;
winTitle := "Document1 - Microsoft Word" ; use Autoit Window Spy to get this
winClass := "OpusApp"
RunWait, winword
return

+1::
    KeyWait, w, D T1 ; KeyboardHook not needed
    if(errorlevel) {
        msgbox, % """Shift + 1 + w"" failed"
        return
    }
    Send, {Backspace} ; erase 'w'
    IfWinNotActive, %winTitle%
    {
        WinActivate, %winTitle%
        WinWaitActive, %winTitle%, , 3
        if(errorlevel)
            MsgBox, % "Failed to activate the window."
    } 
    else ; Last Found Window set
    {
        MsgBox, % "Window already activated."

    }
return


F11::Reload

Teşekkürler. Bunlarla oynuyorum, ama orada etkili bir if-else döngüsü elde etmeyi gerçekten bilmiyorum. Eğer IfWinActive yanlışsa, başka bir komutun parçası olarak uygun Çalıştır komutunu nasıl başlatabilirim?
Peter Verbeet

@PeterVerbeet: düzenlemeye bakın. Word 2007 İngilizce sürümünü kullandım. Komut dosyasının nasıl çalıştığını görmek için Shift + 1 + w tuşlarına basın.
colemik

Bunu birkaç kez düzenledim.
colemik

Teşekkürler trismarck, bu gerçekten yararlı. Harika çalışıyor. Daha "genel" hale getirmenin bir yolu var mı? Şu anda Word tarafından hangi belgenin düzenlenmekte olduğuna bakılmaksızın bunun çalışmasını istiyorum. Bana öyle geliyor ki, her seferinde komut dosyasındaki adı manuel olarak değiştirmek zorunda kalıyorum (Word'ü çok kullanıyorum ve nadiren "Belge1" kullanıyorum. aktif üzerinde?
Peter Verbeet

1

Bazıları kadar karmaşık olmayabilir, ancak programların çoğunu başlatmak için kullandığım şey bu. Geçiş, etkin durumdaysa pencereyi simge durumuna küçültmenizi sağlar.

^NumpadDot::ShowStart("Google Chrome", "chrome.exe")

ShowStart(title, exe, toggle = 0)
{
    If WinActive(title) and toggle
        WinMinimize %title%
    Else
        {
            IfWinExist, %title%
                WinActivate
            else
            {
                Run, %exe%
                WinActivate
            }
        }
}

her zaman 0 olmaz mı?
Sam Hasler

0

Bu sorunu kendim için bu şekilde çözdüm. https://superuser.com/a/1405409/997992 Orijinal yazıda, gerçek windows yöneticisi olarak adlandırılan bir pencere eklentisi kullandığımı belirtmeyi unuttum, bu yüzden WinWist ile gerçek bir pencere için fazladan bir kontrolüm var. VEYA explorer.exe.

Bu yardımcı olur umarım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.