Oct 17, 2009
Saturday, October 17, 2009

ใช้ AutoIt สร้าง HotKey ปุ่มเดียว ปิดเปิดโปรแกรมได้ดั่งใจ :3

     ก็มาถึงตอนสุดท้ายสำหรับเรื่องราวการสร้างปุ่ม HotKey กันแล้วนะครับ สำหรับตอนนี้เราจะศึกษาการสร้างปุ่ม HotKey สองแบบด้วยกันคือ

     [[1]] ปุ่ม HotKey ที่กดแล้วหยุดการทำงานของสคริปต์โปรแกรมที่เราทำขึ้นมา พอกดปุ่มเดิมซ้ำอีกครั้งโปรแกรมก็เริ่มทำงานต่อทันที

     [[2]] ปุ่ม HotKey ที่กดแล้วจะหยุดการทำงานของสคริปต์ชั่วคราว ตามเวลาที่กำหนด เช่น กดปุ่มหนึ่งครั้ง สคริปต์ก็หยุดทำงานไป 5 วินาที ก่อนจะเริ่มทำงานตามสคริปต์อีกครั้งอัตโนมัติ

     ความน่าสนใจของเนื้อหาบทนี้จริงๆ ก็น่าจะเป็นการสร้างปุ่มในแบบที่ 2 เพราะรูปแบบการหยุดสคริปต์ชั่วคราวนั้น เราสามารถประยุกต์ใช้ในการสร้าง AI ให้โปรแกรมทำงานเหมือนคนยิ่งขึ้น อาจจะมีการสุ่มเวลาในการหยุด หรือสุ่มหยุดตามเงื่อนไขที่กำหนด ทำให้เกิดการกระทำที่คาดเดาไม่ได้ ใกล้เคียงกับระบบคิดตัดสินใจของคนยิ่งขึ้น แต่ขอดูเนื้อหาก่อนนะครับ หากยาวเกินไปคงต้องตัดไปเขียนประกอบกับเรื่องอื่นที่จะสอนโปรแกรม AutoIT แทน
     เริ่มแรกสร้างโปรแกรมสำหรับวนลูปง่ายๆ กันก่อน คำสั่ง While ผมได้อธิบายไปแล้วตั้งแต่การสอน AutoIt ตอนก่อนๆ นะครับ ใครลืมลองหาอ่านดู (ผมก็จำไม่ได้ว่าตอนไหน) คุณนำโค้ดด้านล่างนี้ไปแปะในหน้าต่างโปรแกรม SciTe แล้วลองทำสอบรัน( F5) ดูจะเห็นว่ามีทูลทิปปรากฏขึ้นบนมุมซ้ายบนของจอภาพ โดยมีการนับเวลาไปเรื่อยๆ
     การสร้างชุดคำสั่งวนลูปนี้ก็เพื่อนำมาทดสอบ การเขียนสคริปต์หยุดการทำงานของโปรแกรมนั่นเอง

$i = 0
While 1
    $i = $i + 1
    ToolTip($i, 0, 0, "ทดสอบการนับเวลา")
    Sleep(100)
WEnd


     อย่างไรก็ตามสำหรับคนขี้เกียจหา ผมจะอธิบายคำสั่งไว้ย่อๆ ดังนี้

$i = 0
;สร้างตัวแปร $i เก็บค่าเป็น 0 เอาไว้นอกลูป
While 1
;เริ่มต้นการวนลูปไม่สิ้นสุด
    $i = $i + 1
;บวกค่าเพิ่มเข้าไปเข้าไปที่ตัวแปร $i โดยบวกเพิ่มไปทีละ 1ต่อรอบการวนลูป
    ToolTip($i, 0, 0, "ทดสอบการนับเวลา")
;สร้างทูลทิปโดยดึงเอาตัวแปร $i มาแสดง พร้อมกับกำหนดให้ทูลทิปแสดงที่จุด 0x0 คือจุดมุมขวาบนที่หน้าจอ และทำแถบไตเติลที่มีข้อความว่า ทดสอบการนับเวลา
    Sleep(100)
;หน่วงเวลาไว้ 100 มิลลิวินาที (1000 เท่ากับ 1วินาที) ก่อนจะวนลูปรอบต่อไป
WEnd
;จบรอบการวนลูป กระโดดไปยังจุดเริ่มต้นของลูปอีกครั้ง

     ต่อไปก็มาเริ่มสร้างปุ่ม HotKey เพื่อหยุดการทำงานของสคริปต์แบบที่ 1 กันครับ ก่อนอื่นนั้นขออธิบายหลักการสร้างปุ่ม HotKey สำหรับหยุดสคริปต์ก่อน เราจะสร้างตัวแปรขึ้นมาตัวหนึ่ง สมมุติว่า pssix ก็ประกาศให้เป็นตัวแปรแบบ Global ก่อนที่ด้านบนตัวสคริปต์ ดังตัวอย่างด้านล่างนี้

Global $pssix

     ตัวแปรแบบ Global จะเป็นตัวแปรที่เมื่อประกาศแล้ว สามารถนำไปใช้กับฟังก์ชั่นใดก็ได้ในสคริปต์ อธิบายแบบให้เห็นภาพก็คือ เปรียบเหมือนกับการเอ่ยชื่อคนดังๆ อย่าง  โอบามา(Barack Obama) ซึ่งใครๆ ก็รู้จัก 

     เมื่อสร้างตัวแปรแบบ Global ขึ้นมาแล้ว ต่อมาเราก็สร้าง HotKey ที่จะทำการหยุดสคริปต์ชั่วคราวดังตัวอย่างด้านล่างนี้

HotKeySet("{Space}", "Pause")
Global $pssix
Func Pause()
    $pssix = Not $pssix
    While $pssix
        Sleep(500)
        ToolTip('หยุดชั่วคราว', 0, 0)
    WEnd
    ToolTip("")
EndFunc
   

    รูปแบบการสร้าง HotKey จะเหมือนกับตอนก่อนหน้านี้ โดยสคริปต์นี้จะทำงานก็ต่อเมื่อเรากดปุ่ม Space bar ที่คีย์บอร์ด สิ่งที่ต่างไปคือภายในตัวสคริปต์จะมีการใช้ Operator Not ซึ่งเป็นการกลับค่าตัวแปร $pssix ให้กลายเป็นค่าตรงข้ามกัน แล้วดึงเอาค่าที่กลับด้านมาใส่ในตัวแปร $pssix ซ้ำอีกครั้ง  งงไหมครับ

     $pssix = Not $pssix คือคำสั่งที่เราจะใช้ บางท่านอาจจะยังงงอยู่ เอาแบบสรุปง่ายๆ ก็คือ เราใช้ตัวคำสั่ง Not ทำให้ค่าตัวแปรเปลี่ยนจากเท็จกลายเป็นจริง(หรือจริงเป็นเท็จ ขึ้นอยู่ว่าค่าเริ่มต้นตัวแปรมันเป็นค่าอะไร เมื่อใช้คำสั่ง Not ก็จะเปลี่ยนให้มันตรงข้าม)  ทีนี้พอมันกลายเป็นค่าตรงข้ามแล้ว มันก็เลยไม่ใช่ตัวแปรตัวเดิม ซึ่งเราสามารถนำตัวแปรที่เปลี่ยนค่านี้ไปใช้ประโยชน์จากคำสั่งถัดมาคือ

While $pssix

     ตัวคำสั่ง While คุณคงเข้าใจแล้วว่ามันเป็นคำสั่งลูป แต่ถ้าเราเพิ่มค่าตัวแปรต่อท้ายคำสั่งเข้าไป มันก็จะกลายเป็นลูปที่ตรวจสอบค่าตัวแปรไปทันที ถ้าค่าตัวแปรที่เพิ่มเข้าไปยังเป็นจริงอยู่มันก็จะวนลูปอยู่อย่างนั้น แต่ถ้าเมื่อใดก็ตามค่าตัวแปรกลายเป็นเท็จ ลูปจะสลายไปทันที

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

     อธิบายคำสั่ง

HotKeySet("{Space}", "Pause") ;สร้าง Hotkey โดยกำหนดให้กดปุ่ม สเปชบาร์ จะกระโดดไปยังฟังชั่น Pause ทันที
Global $pssix ;ประกาศตัวแปร Global ชื่อ $pssix มีค่าเริ่มต้นสถานะเป็นเท็จ
Func Pause()  ;เริ่มต้นฟังชั่น Pause
    $pssix = Not $pssix ;กำหนดให้ค่าตัวแปร $pssix กลับด้านจากเท็จเป็นจริง
    While $pssix  ;ลูปเริ่มทำงาน โดยตรวจสอบค่าตัวแปร $pssix ถ้ายังเป็นจริงก็จะทำงานอยู่
        Sleep(500)  ;หน่วงเวลาครึ่งวินาที
        ToolTip('หยุดชั่วคราว', 0, 0)  ;แสดงทูลทิปที่มุมซ้ายบนของหน้าจอ
    WEnd  ;จบการวนลูป เริ่มเข้าไปวนลูปอีกครั้ง
    ToolTip("") ;ถ้าลูปเป็นเท็จจะทำการรีเซ็ตลบข้อความที่อยู่ในทูลทิปเดิมทิ้งไป
EndFunc   
;จบฟังก์ชั่น Pause

ถ้านำไปเขียนลงในโปรแกรมก็จะได้ดังรูปด้านล่างนี้


---------------------------
    ทีนี้มาดูการสร้างปุ่ม HotKey ที่กดแล้วจะหยุดการทำงานของสคริปต์ชั่วคราว ตามเวลาที่กำหนด หลังจากครบเวลาแล้วก็จะทำงานสคริปต์ที่ค้างไว้อัตโนมัติ
     การหยุดสคริปต์ชั่วคราวตามเวลาที่กำหนดนั้น ทำได้หลายแบบ แต่เพื่อไม่ให้สับสนจนเกินไปผมจะเอาตัวอย่างคำสั่ง เดิมมาแก้ไข หลักการทำก็คือ เราจะสร้างค่าตัวแปรเอาไว้เก็บตัวเลขอันหนึ่ง ตามตัวอย่างนี้คือ 10 จากนั้นก็ใช้คำสั่ง While ตรวจสอบตัวเลขที่ค่าตัวแปรนั้น

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

     คำสั่งที่ใช้คือ

HotKeySet("{Space}", "Pause")
Func Pause()
    $a = 10
    While $a > 0
        Sleep(1000)
        ToolTip('หยุดชั่วคราว ' & $a, 0, 0)
        $a = $a - 1
    WEnd
    ToolTip("")
EndFunc
 

อธิบายคำสั่ง

HotKeySet("{Space}", "Pause") ;สร้าง Hotkey โดยกำหนดให้กดปุ่ม สเปชบาร์ จะกระโดดไปยังฟังชั่น Pause ทันที
Func Pause() ;เริ่มต้นฟังชั่น Pause
    $a = 10 ;ประกาศตัวแปร $a มีค่าเท่ากับ 10
    While $a > 0 ;ลูปเริ่มทำงาน โดยตรวจสอบค่าตัวแปร $a ถ้ามีค่าน้อยกว่า 0 เมื่อใดลูปจะสลายไปทันที
        Sleep(1000) ;หน่วงเวลา 1 วินาที 
        $a = $a – 1
;นำตัวแปร $a มาลบ 1 ทุกครั้งที่มีการวนลูปมาถึงคำสั่งนี้ 
        ToolTip('หยุดชั่วคราว ' & $a, 0, 0)
;แสดงทูลทิป โดยดึงเอาค่าตัวแปร $a มาแสดงด้วย เราจะได้เห็นค่าตัวเลขที่ถูกลบ
    WEnd ;จบคำสั่งวนลูป กลับไปยังจุดเริ่มต้นลูปอีกครั้ง
    ToolTip("") ;ถ้าลูปเป็นเท็จจะทำการรีเซ็ตลบข้อความที่อยู่ในทูลทิปเดิมทิ้งไป
EndFunc   
;จบฟังก์ชั่น Pause

ถ้านำไปเขียนลงในโปรแกรมก็จะได้ดังรูปด้านล่างนี้


     ถ้าคุณจะสุ่มการหยุดชั่วคราว ก็ทำได้ด้วยการเปลี่ยนคำสั่ง     $a = 10 ให้กลายเป็นคำสั่ง

$a = int(Random(1,10))

    คำสั่งนี้จะทำการสุ่มตัวเลขต่ำสุดที่ 1 และสูงสุดที่ 10 ซึ่งตัวเลขที่มีการสุ่มออกมาจะมีตำแหน่งทศนิยมด้วย เราจึงต้องใช้คำสั่ง int ควบไว้อีกชั้น เพื่อปรับให้ตัวเลขจำนวนเต็ม คำสั่งแก้ไขแล้วก็จะได้ดังนี้ (ผมได้เพิ่มคำสั่งเพื่อกำหนด HotKey ปุ่ม ESC แล้วปิดการทำงานของโปรแกรมไปด้วย)

HotKeySet("{Space}", "Pause")
HotKeySet("{ESC}", "stop")

$i = 0
While 1
    $i = $i + 1
    ToolTip($i, 0, 0, "ทดสอบการนับเวลา")
    Sleep(100)
WEnd

Func Pause()
    $a = int(Random(1,10))
    While $a > 0
        Sleep(1000)
        $a = $a - 1
ToolTip('หยุดชั่วคราว ' & $a, 0, 0)
    WEnd
    ToolTip("")
EndFunc

Func stop()
    Exit
EndFunc

นำไปเขียนลงในโปรแกรมก็จะได้ดังรูปด้านล่างนี้


     ถ้ายังอ่านแล้วไม่ค่อยเข้าใจ ลองเอาสคริปต์ไปรันก่อนนะครับ แล้วลองแก้ไขคำสั่ง เพื่อดูผลที่เปลี่ยนไปจะได้เข้าใจง่ายขึ้น

###จบแล้วครับ###

0 comments:

Post a Comment

    ส่วนนี้สำหรับแสดงความคิดเห็นทั่วไป สอบถามปัญหาตั้งถามได้ที่ฟอรั่ม


>>> [โปรดอ่าน] เนื่องจาก บทความการใช้งานบางโปรแกรมได้โฟสไปนานแล้ว
โปรแกรมอาจมีการอัปเดท วิธีการใช้งาน อาจใช้ไม่ได้ หรือมีวิธีที่ง่ายกว่าในเวอร์ชั่นใหม่
หากคุณพบว่าวิธีการใช้งานไม่ตรงกับบทความในบล็อกนี้ สามารถแนะนำเพิ่มเติมได้ครับ