วิธีทำให้ AutoHotkey ปิดกล่องโต้ตอบป็อปอัพโดยอัตโนมัติ


3

คำถาม

ฉันต้องการให้ AutoHotkey ตรวจพบโดยอัตโนมัติเมื่อมีข้อความโต้ตอบปรากฏขึ้นและดำเนินการบางอย่าง ฉันจะทำอย่างไร

ตัวอย่างคอนกรีต

ในกรณีเฉพาะของฉันฉันต้องการ AutoHotkey เพื่อปิดกล่องโต้ตอบอัปเดตสารบัญ Word จะปรากฏขึ้นเมื่อฉันต้องการอัปเดตสารบัญ

นี่คือขั้นตอนการทำงาน:

  1. ฉันอัปเดตชื่อในเอกสาร Word ของฉัน
  2. ฉันกดCtrl+ Aเพื่อเลือกเอกสารทั้งหมด
  3. ฉันกดF9เพื่ออัปเดตทุกฟิลด์
  4. กล่องโต้ตอบโมดอลที่น่ารำคาญนี้ปรากฏขึ้น (ซึ่งไม่สามารถกำหนดค่าได้ตามการค้นหา Google ของฉัน) ป้อนคำอธิบายรูปภาพที่นี่

  5. ตอนนี้ฉันต้องกดArrow downเพื่อเลือกอัปเดตตารางทั้งหมดแล้วตามด้วยEnterเพื่อกดตกลงและดำเนินการต่อ

ฉันต้องการ AutoHotkey ที่จะออกโดยอัตโนมัติArrow down, Enterคำสั่งเพราะเวิร์กโฟลว์อธิบายไว้ข้างต้นเป็นสิ่งที่ฉันทำโหลครั้งต่อวัน

แน่นอนเพราะฉันเริ่มต้นเวิร์กโฟลว์ฉันสามารถเขียนสคริปต์ AutoHotkey ที่ทำทุกอย่างให้ฉันเริ่มต้นด้วยCtrl+ Aดังนี้:

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

อย่างไรก็ตามตัวอย่างข้างต้นเป็นเพียงภาพประกอบวัตถุประสงค์และมีบางกรณีที่กล่องโต้ตอบป๊อปอัปปรากฏขึ้นแบบสุ่มและฉันต้องการ AutoHotkey ดำเนินการบางอย่างขึ้นอยู่กับชื่อของกล่องโต้ตอบป๊อปอัป

การวิจัยของฉันจนถึงตอนนี้

  • แหล่งที่มาของอินเทอร์เน็ตบางแห่งแนะนำให้ใช้การวนรอบ AutoHotkey ที่วนซ้ำและตรวจสอบอย่างต่อเนื่องโดยบอกว่าทุกวินาทีไม่ว่าจะมีหน้าต่างที่มีชื่อเรื่องที่แน่นอนอยู่แล้วปิดลง แต่ฉันพบว่ามันเป็นการสิ้นเปลืองทรัพยากรของ CPU
  • แหล่งข้อมูลทางอินเทอร์เน็ตอื่น ๆ พูดถึงshell hookพร้อมกับข้อมูลโค้ดและฉันคิดว่านั่นเป็นวิธีที่จะไป แต่ฉันไม่เข้าใจข้อมูลโค้ด ทุกคนสามารถอธิบายวิธีการทำงานและให้ตัวอย่างที่เข้าใจได้ซึ่งเป็นวิธีแก้ปัญหาหรือไม่

โค้ดต่อไปนี้คัดลอกมาจากที่นี่

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
}

ฉันเห็น

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

ส่วนหนึ่ง สิ่งที่เหลือทั้งหมดทำอะไร?

คำตอบ:


0

คุณกำลังจะลึก การมีโปรแกรมตรวจสอบสำหรับชื่อหน้าต่างที่ระบุนั้นไม่ต้องเสียภาษีในทรัพยากรระบบ นั่นอาจเป็นวิธีที่จะไป

ShellMessageอาจเป็นชื่อที่คุณเลือกเนื่องจากเป็นฟังก์ชันที่เรียกโดยOnMessageซึ่งเป็นสิ่งที่ถูกเรียกเมื่อสคริปต์ของคุณได้รับข้อความ เนื้อหาของฟังก์ชั่นนี้ควรเป็นรหัสของคุณเพื่อให้แน่ใจว่าคุณอยู่ในหน้าต่างด้านขวาแล้วออกคำสั่งที่คุณต้องการส่ง ฟังก์ชั่นของคุณสามารถยอมรับได้ถึงสี่พารามิเตอร์ที่กำหนดไว้ในแฟ้มความช่วยเหลือOnMessageสำหรับ

DllCallเส้นบิตลับที่ผูกใน Windows ที่จะได้รับข้อความจากระบบ นี่คือที่ที่คุณควรรู้ว่าคุณกำลังทำอะไรหากคุณกำลังยุ่งกับการฮูดเข้าไปใน Windows

SetBatchLines, -1และProcess, Priority,, Highบอกว่าสคริปต์ของคุณมีความสำคัญมากและควรใช้ความเร็วสูงสุดตลอดเวลาและไม่มีกระบวนการอื่นใดที่ควรทำให้ช้าลง

Gui +LastFoundและhWnd := WinExist()กำลังมองหา ID ที่ไม่ซ้ำกันของสคริปต์นี้เมื่อมีการทำงานเพื่อที่จะสามารถได้รับการจดทะเบียนกับ Windows DllCallในภายหลัง


0

สำหรับรหัสที่มีประสิทธิภาพซึ่งไม่ได้สำรวจและตอบสนองได้ดีกว่าคุณสามารถปรับรหัสได้ที่นี่:

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

ในส่วนการตั้งค่าของไฟล์เพิ่มคำสั่งเหล่านี้:

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

ตรวจสอบให้แน่ใจว่ามีแท็บระหว่างคอลัมน์ในส่วนการตั้งค่านี้ของสคริปต์ (และไม่เว้นวรรคทั้งนี้ขึ้นอยู่กับโปรแกรมแก้ไขที่คุณใช้) ชื่อ exe เป็นแบบตรงตามตัวพิมพ์เล็กและใหญ่เนื่องจากใช้การจับคู่ RegEx เว้นแต่คุณจะเปลี่ยน

จากนั้นรหัสนี้จะลงไปในเนื้อหาของสคริปต์ ...

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

คุณสามารถใช้ตัวอย่างข้อมูลที่คุณโพสต์ ... เป็นเรื่องเดียวกัน

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 ส่ง Alt + e เพื่ออัปเดตทั้งตาราง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.