AutoHotkey'in bir açılır pencereyi otomatik olarak kapatması nasıl yapılır?


3

Soru

AutoHotkey'in belirli bir açılır iletişim kutusunun ne zaman görüneceğini otomatik olarak algılamasını ve belirli işlemleri gerçekleştirmesini istiyorum. Bunu nasıl yaparım?

Somut örnek

Özel durumumda, içindekileri güncellemek istediğimde AutoHotkey'in İçindekiler'i Güncelle iletişim kutusu Word'ün kapatmasını istiyorum.

Bu iş akışıdır:

  1. Word dokümanımdaki başlıkları güncelliyorum
  2. Belgenin tamamını seçmek için Ctrl+ tuşlarına basınA
  3. F9Tüm alanları güncellemek için tuşuna basın
  4. Bu sinir bozucu kalıcı iletişim kutusu görünür (Google aramalarıma göre yapılandırılamaz) görüntü tanımını buraya girin

  5. Şimdi, Tüm tabloyu güncelleArrow down seçeneğini seçmek için tuşuna ve ardından Tamam tuşuna basıp devam etmek için tuşuna basmam gerekiyor.Enter

AutoHotkey'in otomatik olarak komut vermesini istiyorum Arrow down, Enterçünkü yukarıda açıklanan iş akışı günde bir düzine kez yaptığım bir şey.

Tabii ki, iş akışını başlattığım için, benim için her şeyi yapan Ctrl+ Agibi bir AutoHotkey betiği yazabilirim :

#IfWinActive ahk_class OpusApp
F9::
Send, ^a
Send, {F9}
Sleep, 200
Send, {Down}
Send, {Enter}
return

Ancak, yukarıdaki örnek yalnızca örnekleme amaçlıdır ve pop-up iletişim kutularının rastgele göründüğü durumlar vardır ve AutoHotkey'in pop-up iletişim kutusunun başlığına bağlı olarak bazı işlemler yapmasını istiyorum.

Şimdiye kadarki araştırmam

  • Bazı İnternet kaynakları süresiz olarak sarkan ve kontrol eden bir AutoHotkey döngüsünün kullanılmasını önerir , her saniyede belirli bir başlığa sahip bir pencerenin olup olmadığını ve onu kapatıp kapatmadığını söyler. Ancak bunu CPU kaynaklarının israfı olarak buluyorum
  • Diğer bazı İnternet kaynakları , kod pasajı ile birlikte bir kabuk kancasından bahseder ve sanırım bu yolun yoludur, ama kod pasajını anlamıyorum; kimse bunun nasıl çalıştığını açıklayabilir ve çözüm olması şartıyla anlaşılabilir bir örnek verebilir mi?

Aşağıdaki kod pasajı buradan kopyalanır .

SetBatchLines, -1
Process, Priority,, High


Gui +LastFound
hWnd := WinExist()


DllCall( "RegisterShellHookWindow", UInt,hWnd )
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
OnMessage( MsgNum, "ShellMessage" )
Return


ShellMessage( wParam,lParam ) {
  If ( wParam = 32772 or WParam = 4) ;  HSHELL_WINDOWACTIVATED := 4 or 32772
       WinGetActiveTitle, Title
  If  ( Title = "sun 4 - foxtrot - Remote Desktop Connection" ) 
        SetCapsLockState, on
    else SetCapsLockState, off
}

görüyorum

If (Title = "sun 4 - foxtrot - Remote Desktop Connection") 

Bölüm. Diğerleri ne iş yapıyor?

Yanıtlar:


0

Derin gidiyorsun Belirli bir pencere adı için bir program izleyicisine sahip olmak, sistem kaynakları için bir vergi değildir. Muhtemelen gitmenin yolu budur.

ShellMessageSeçiminizin herhangi bir adı olabilir, çünkü OnMessagekomut dosyası bir mesaj aldığında tetiklenenin başlattığı işlevdir . Bu fonksiyonun içeriği, doğru pencerede olduğunuzdan emin olmak ve daha sonra göndermek istediğiniz komutları yayınlamak için kodunuz olmalıdır. İşleviniz, dört parametre kadar kabul edebilir yardım dosyasında tanımlanan için OnMessage.

DllCallÇizgiler sistemden iletileri almak için Windows içine kravat gizli bit vardır. Burası, Windows’a kukuletayla uğraşacaksanız, ne yaptığınızı bilmeniz gereken yerdir.

SetBatchLines, -1ve Process, Priority,, Highbetiğinizin çok önemli olduğunu ve her zaman tam hızda çalışması gerektiğini ve başka hiçbir sistem işleminin onu yavaşlatmaması gerektiğini söyleyin.

Gui +LastFoundve hWnd := WinExist()bu betiğin benzersiz kimliğini çalışırken izler, böylece daha sonra Windows'a kaydedilebilir DllCall.


0

Yoklamayan ve daha duyarlı olan verimli kod için, kodu burada uyarlayabilirsiniz:

http://www.autohotkey.com/board/topic/84397-winwait-framework-do-something-to-a-window-when-it-appears/

Dosyanın kurulum bölümünde şu ifadeleri ekleyin:

Update Table of Contents ahk_exe WINWORD.EXE    B       WordTOCupdate
Update Table of Figures ahk_exe WINWORD.EXE     B       WordTOCupdate

Komut dosyasının bu kurulum bölümündeki sütunlar arasında sekmeler olduğundan emin olun (kullandığınız düzenleyiciye bağlı olarak boşluk değil). Exe adı, siz değiştirmediğiniz sürece RegEx eşleştirme kullandığından büyük / küçük harf duyarlıdır.

Sonra bu kod betiğin gövdesinde yer alır ...

;-------------------------------------------------------
; Check for Microsoft Word Update Table of Contents
;-------------------------------------------------------
WordTOCupdate:
    WinActivate             ;Set Window to Be on top
    SendInput !e{Enter}
return

Ayrıca gönderdiğiniz pasajı da kullanabilirsiniz ... temelde aynı şey.

Gui +LastFound
hWnd := WinExist()


DllCall( "RegisterShellHookWindow", UInt,hWnd )
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
OnMessage( MsgNum, "ShellMessage" )
Return


ShellMessage( wParam,lParam ) {
  If ( wParam = 32772 or WParam = 4) ;  HSHELL_WINDOWACTIVATED := 4 or 32772
       WinGetActiveTitle, Title
  If  (Title="Update Table of Contents" ) 
  {
       SendInput !e{Enter}   
  }
} 

! E, tüm tabloyu güncellemek için Alt + e gönderir.

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.