เมาส์และคีย์บอร์ดเป็นหน่วยรับข้อมูล (Input unit) ที่สำคัญของคอมพิวเตอร์ในระบบปฏิบัติการ Windows ซึ่งจะทำหน้าที่ติดต่อระหว่างผู้ใช้กับคอมพิวเตอร์ ดังนั้นการเขียนโปรแกรมควบคุมหรือการจำลองการทำงานของเมาส์และคีย์บอร์ดจึงเป็นอีกแนวทางหนึ่งในการเพิ่มความสามารถโปรแกรมของเราให้มีการทำงานแบบอัตโนมัติได้ในระดับหนึ่ง เช่น การคลิกเมาส์แบบอัตโนมัติ, การกดคีย์บนแป้นพิมพ์คีย์บอร์ด, การตรวจสอบการกดคีย์บอร์ดและการเลื่อนเคอร์เซอร์ เป็นต้น
เมาส์และคีย์บอร์ด
ในบทนี้เราจะได้เรียนรู้การเขียนโปรแกรมควบคุมการทำงานของเมาส์และคีย์บอร์ดโดยการเรียกใช้โพรซีเยอร์ของ Visual Basic และการใช้ฟังก์ชัน API ของ Window ซึ่งในตอนต้นเราจะศึกษาโพรซีเยอร์พื้นฐานของเมาส์ (Mouse event) และคีย์บอร์ด (Keyboard event) ของ Visual Basic เช่น เหตุการณ์ที่เกิดขึ้นเมื่อมีการกดปุ่มเมาส์, เหตุการณ์ที่เกิดจากการเลื่อนเคอร์เซอร์และเหตุการณ์ที่เกิดเมื่อมีการกดคีย์ใด ๆ บนแป้นพิมพ์คีย์บอร์ด ซึ่งเราจะใช้เหตุการณ์เหล่านี้มาเป็นเงื่อนไขสำหรับเขียนโปรแกรมควบคุมการทำงานของคอนโทรลต่าง ๆ ของ Visual Basic และเปรียบเทียบการตอบสนองเหตุการณ์ของคอนโทรลชนิดต่าง ๆ เมื่อมีการคลิกหรือดับเบิลคลิก จากนั้นเราจะศึกษาเกี่ยวกับฟังก์ชัน API (Application Programming Interface) ของ Windowsรวมถึงฟังก์ชัน API ที่เกี่ยวข้องกับเมาส์และคีย์บอร์ด ซึ่งเป็นส่วนสำคัญที่เราจะนำไปใช้ในการเขียนโปรแกรม Auto click ในบทที่ 4
ในตอนท้ายของบทเราจะได้เรียนรู้การเขียนโปรแกรมการจำลองการทำงานของเมาส์และคีย์บอร์ด เช่น การแดรกไฟล์, การดรอปไฟล์, การคลิกและการเปิดไฟล์ด้วยการดับเบิลคลิก, โปรแกรมคีย์บอร์ดจำลอง (Visual Keyboard) สำหรับการตรวจจับการทำงานของคีย์บอร์ด และโปรแกรม Key Logger สำหรับการดักจับการใช้คอมพิวเตอร์ เพื่อให้คุ้นเคยกับคำศัพท์ของการเขียนโปรแกรม ผู้เขียนจะใช้ศัพท์ภาษาอังกฤษ “Mouse event” แทน “เหตุการณ์ของเมาส์” และ “Keyboard event” แทน “เหตุการณ์ของคีย์บอร์ด”
เหตุการณ์ของเมาส์ (Mouse Event) ใน Visual Basic
Mouse event คือเหตุการณ์ที่เกิดขึ้นเมื่อเรากดเมาส์ (ปุ่มซ้าย, ปุ่มขวาหรือปุ่มกลาง) และการเลื่อนเคอร์เซอร์บนฟอร์มหรือคอนโทรลในขณะที่เรารันโปรแกรม Visual BasicVisual Basic มีโพรซีเยอร์ Mouse event สำหรับฟอร์มและคอนโทรลต่าง ๆ 3 เหตุการณ์ คือ MousDown, MouseUp และ MouseMove โดยมีเงื่อนไขการการเกิด Mouse event ดังรายละเอียดดังนี้
1. เคอร์เซอร์จะต้องอยู่บนฟอร์มหรือคอลโทรลที่ต้องการให้เกิดเหตุการณ์และจะเกิดขึ้นกับคอนโทรลเพียงตัวเดียวเท่านั้น
1. เคอร์เซอร์จะต้องอยู่บนฟอร์มหรือคอลโทรลที่ต้องการให้เกิดเหตุการณ์และจะเกิดขึ้นกับคอนโทรลเพียงตัวเดียวเท่านั้น
จะเกิดแยกกันระหว่างฟอร์มและคอนโทรลลาเบลฟอร์มหรือคอลโทรลจะต้องอยู่ในสถานะ Enable
รูปแบบของโพรซีเยอร์ Mouse Event
Private Sub ชื่ออ๊อบเจ็คต์_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ... End Sub Private Sub ชื่ออ๊อบเจ็คต์_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) ... End Sub Private Sub ชื่ออ๊อบเจ็คต์_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) ... End Sub |
อธิบายพารามิเตอร์ของโพรซีเยอร์ Mouse Event
Button เป็นพารามิเตอร์ชนิด Integer ใช้แสดงค่าของเมาส์เมื่อถูกกด ซึ่งค่า Button จะแทนด้วยตัวเลขฐาน 16 หรือค่าคงที่เรียกเฉพาะ ซึ่งมีรายละเอียดดังนี้
ค่าคงที่ | ค่าของปุ่มเมาส์ | คำอธิบาย |
VbLeftbutton | 1 | ปุ่มเมาส์ซ้ายถูกกด |
VbRightbutton | 2 | ปุ่มเมาส์ขวาถูกกด |
VbMiddlebutton | 3 | ปุ่มเมาส์กลางถูกกด |
ในกรณีที่เรากดเมาส์พร้อมกันหลายปุ่ม เราสามารถนำค่า Button มากันรวมได้ เช่น กดปุ่มเมาส์ซ้ายและปุ่มเมาส์ขวา จะได้ว่าค่า Button เท่ากับ 1 + 2 = 3
Button เป็นค่า Virtual Key Code ซึ่งเป็นค่าคงที่มาตรฐานของเมาส์และคีย์บอร์ดในระบบปฏิบัติการ Windows ซึ่งเราจะได้ศึกษารายละเอียดและใช้งานต่อไปในหัวข้อเมธอด Sendkeys ของและฟังก์ชัน API GetKeyState
Note: 1. Virtual Key Code เป็นค่าคงที่ของเมาส์และคีย์บอร์ดมีค่าตั้งแต่ 0 ถึง 254 (ดูเพิ่มเติมในตาราง Virtual Key Code ในภาคผนวก)
บิตที่ 1(Z) แทนค่า VbLeftbutton ซึ่งมีค่าสะถานะเป็น 0000 0001 หรือเท่ากับ 1 ในเลขฐาน 16 บิตที่ 2(X) แทนค่า VbRightbutton ซึ่งมีค่าสะถานะเป็น 0000 0010 หรือเท่ากับ 2 ในเลขฐาน 16 บิตที่ 3(Y) แทนค่า VbMiddlebutton ซึ่งมีค่าสะถานะเป็น 0000 0100 หรือเท่ากับ 4 ในเลขฐาน 16 ดังการกดปุ่มเมาส์พร้อม ๆ กันจึงสามารถนำค่าระดับบิตมารวม (OR) กันทางตรรกศาสตร์ได้ |
Shift เป็นพารามิเตอร์ชนิด Integer เช่นกัน ใช้สำหรับแสดงสถานะของคีย์ Shift, Ctrl และ Alt ขณะที่เกิด Mouse event ซึ่งค่า Shift จะแทนด้วยตัวเลขฐาน 16 หรือค่าคงที่เรียกเฉพาะ ซึ่งมีรายละเอียดดังนี้
ค่าคงที่ | ค่าของสถานะ | คำอธิบาย |
VbShiftbutton | 1 | ปุ่ม Shift ถูกกดขณะเกิด Mouse event |
VbCtrlbutton | 2 | ปุ่ม Ctrl ถูกกดขณะเกิด Mouse event |
VbAltbutton | 4 | ปุ่ม Alt ถูกกดขณะเกิด Mouse event |
ค่า Shift สามารถนำมารวมกันได้เช่นเดียวกับ Button เ ช่น กดคีย์ Shift และคีย์ Ctrl พร้อมกันค่าของ Shift รวมเท่ากับ 1+2 = 3
Note: เหตุการณ์ MouseDown จะเกิดขึ้นเมื่อมีการกดปุ่มเมาส์ เหตุการณ์ MouseUp จะเกิดเหตุการณ์เมื่อ MouseDown สิ้นสุดลง(ปล่อยเมาส์) เหตุการณ์ MouseMove จะเกิดเมื่อเคอร์เซอร์เลื่อนบนฟอร์มหรือคอนโทรล |
X และ Y คือพิกัดปัจจุบัน X และ Y ของเคอร์เซอร์ ขณะที่เคอร์เซอร์อยู่บนฟอร์มหรือคอนโทรล
ตัวอย่างที่ 1 MouseDown Event
1. การทำงานของโปรแกรม
ตัวอย่างนี้เป็นการทดสอบการเกิด Mouse Down event ของฟอร์ม เมื่อเรากดปุ่มเมาส์ลงบนฟอร์มจะมีข้อความ “mouse down” และค่า Button พิมพ์ลงบนฟอร์ม
อ๊อบเจ็กต์ | พร็อพเพอร์ตี้ | ค่าที่กำหนด |
Form1 | Name | frmMain |
Caption | ทดสอบ MouseDown event | |
Border Style | 5 – Sizable ToolWindow |
2. โค้ดของโปรแกรม
Option Explicit |
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) CurrentX = X 'กำหนดตำแหน่งพิกัด X ปัจจุบัน = X CurrentY = Y 'กำหนดตำแหน่งพิกัด Y ปัจจุบัน = Y Print "mouse down" &” ค่า Button= " & Button & " ค่า X= " & X & " ค่า Y = “& Y End Sub |
1. รันโปรแกรม จากนั้นให้เลื่อนเคอร์เซอร์บนฟอร์ม ขณะเดียวกันให้กดปุ่มเมาส์ค้างไว้ซักครู่ ณ ตำแหน่งใด ๆ แล้วจึงปล่อย จะเห็นว่ามีข้อความ, ค่า Button และพิกัดของเคอร์เซอร์ถูกพิมพ์ลงบนฟอร์ม
4. อธิบายโปรแกรม
1. เนื่องจากเราใช้เหตุการณ์ MouseDown เป็นเงื่อนไขของการพิมพ์ข้อความลงบนฟอร์ม ดังนั้นข้อความจะถูกพิมพ์เมื่อมีการกดเมาส์ (ลง) เท่านั้น
2. การกำหนดตำแหน่งของเคอร์เซอร์ปัจจุบัน (CurrentX, CurrentY) ให้เป็นค่าของ X และ Yตามลำดับ ดังนั้นเมื่อมีการกดเมาส์ลง ข้อความจึงถูกพิมพ์ลง ณ ตำแหน่งกดเคอร์เซอร์
CurrentX = X 'กำหนดตำแหน่งพิกัดเคอร์เซอร์ X ปัจจุบัน = X CurrentY = Y 'กำหนดตำแหน่งพิกัดเคอร์เซอร์ Y ปัจจุบัน = Y |
3. ให้ผู้อ่านทดลองเปลี่ยนจากเหตุการณ์ MouseDown เป็น MouseUP จะสังเกตุว่าข้อความจะถูกพิมพ์ลงบนฟอร์มเมื่อเราปล่อยปุ่มเมาส์ ซึ่งตรงกันข้ามกับเหตุการณ์ MouseDown
ตัวอย่างที่ 2 Drawing Pad
1. การทำงานของโปรแกรม
ตัวอย่างนี้เราจะสร้างกระดานวาดภาพ (Drawing Pad) แบบง่าย ๆ ซึ่งมีการทำงานงานคล้ายกับทูล ดินสอ (pencil) ของโปรแกรม Microsoft paint โดยการใช้ MouseDown event และ MouseMove event ของฟอร์มร่วมกับคำสั่งการวาดเส้น (Line) สำหรับการวาดเส้นลงบนฟอร์ม1. การทำงานของโปรแกรม
อ๊อบเจ็คต์ | พร็อพเพอร์ตี้ | ค่าที่กำหนด |
Form1 | Name | frmDrawPad |
Caption | Drawing Pad | |
Border Style | 5 – Sizable ToolWindow | |
BackColor | vbWhite | |
Command Button1 | Name | cmdClear |
Caption | เคลียร์ | |
Command Button2 | Name | cmdExit |
Caption | ออก |
2. โค้ดของโปรแกรม
Option Explicit |
Private Sub cmdClear_Click() frmDrawPad.Cls ‘เคลียร์ฟอร์ม End Sub |
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) CurrentX = X 'กำหนดตำแหน่งพิกัดเคอร์เซอร์ X ปัจจุบัน = X CurrentY = Y 'กำหนดตำแหน่งพิกัดเคอร์เซอร์ Y ปัจจุบัน = Y End Sub |
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 1 Then Line (CurrentX, CurrentY)-(X, Y) ‘วาดเส้น End If End Sub |
1. รันโปรแกรม
1. รันโปรแกรม เลื่อนเคอร์เซอร์ไปบนฟอร์มพร้อมกับกดเมาส์ซ้ายค้างไว้ แล้วสังเกตุว่าจะมีเส้นเกิดขึ้นเมื่อเราลากเคอร์เซอร์ไปมา
4. อธิบายโปรแกรม
1. ในขณะที่เกิด MouseDown event เราจะกำหนดค่าของ X และ Y ให้กับฟังก์ชัน CurrentX และ CurrentY ซึ่งจะเป็นจุดเริ่มต้นของเส้นที่เราจะวาดลงบนฟอร์ม
CurrentX = X 'กำหนดตำแหน่งพิกัดเคอร์เซอร์ X ปัจจุบัน = X CurrentY = Y 'กำหนดตำแหน่งพิกัดเคอร์เซอร์ Y ปัจจุบัน = Y |
2. ในโพรซีเยอร์ของ MouseMove event เรากำหนดเงื่อนไขว่าถ้ามีการกดปุ่มเมาส์ซ้าย (ค่า Button = 1) ให้สร้างเส้นจากจุด CurrentX และ CurrentY ไปถึง X และ Y
If Button = 1 Then Line (CurrentX, CurrentY)-(X, Y) ‘วาดเส้นลงบนฟอร์ม End If |
3. กดปุ่ม “เคลียร์” สำหรับลบเส้นที่พิมพ์บนฟอร์ม
frmDrawPad.Cls |
ในบทความต่อไปเราก็จะมาพูดถึงการทำงานลำดับของเมาส์และการทำงานของคีย์บอร์ด ซึ่งรับรองว่าระดับความมันส์เพิ่มขึ้นเรื่อย ๆ จ้า