วันพฤหัสบดีที่ 15 กันยายน พ.ศ. 2554

ฟังก์ชันของเมาส์และคีย์บอร์ด ภาค1

เมาส์และคีย์บอร์ดเป็นหน่วยรับข้อมูล (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 Basic
Visual Basic มีโพรซีเยอร์ Mouse event สำหรับฟอร์มและคอนโทรลต่าง ๆ 3 เหตุการณ์ คือ MousDown, MouseUp และ MouseMove โดยมีเงื่อนไขการการเกิด Mouse event ดังรายละเอียดดังนี้
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 ในภาคผนวก)

0000 0XYZ
2. ถึงแม้ว่า Button จะเป็นพารามิเตอร์แบบ Integer แต่เนื่องจากใช้สำหรับเก็บค่า Virtual Key Code ซึ่งเป็นพารามิเตอร์ระดับบิต ดังนั้น Button จึงมีข้อมูล 3 บิตแรกเป็นค่า Vitual 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

3. รันโปรแกรม
           
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) สำหรับการวาดเส้นลงบนฟอร์ม

อ๊อบเจ็คต์
พร็อพเพอร์ตี้
ค่าที่กำหนด
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

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

1 ความคิดเห็น:

  1. สวัสดีค่ะ...รอภาค 2 ค่ะ...ขอบคุณมากมีประโยชน์มากเลยค่ะ ^^

    ตอบลบ