Lập trình hệ thống phkkhanh bai3 tài liệu, giáo án, bài giảng , luận văn, luận án, đồ án, bài tập lớn về tất cả các lĩnh...
Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lập trình hệ thống BÀI 3: XỬ LÝ SỰ KIỆN MỤC ĐÍCH THÍ NGHIỆM Giúp sinh viên thực nghiệm khảo sát vấn đề sau : - Tìm hiểu phương pháp chặn kiện - Lập trình chặn kiện bàn phím THIẾT BỊ SỬ DỤNG Máy vi tính PHẦN I : CƠ SỞ LÝ THUYẾT Sự kiện (Event) tác động lên đối tượng mơi trường Windows Khi có kiện xảy ra, Windows gởi thông điệp (message) đến đối tượng Các kiện thường xảy là: - Sự kiện chuột: Click, Double Click, … - Sự kiện bàn phím: nhấn phím, nhả phím, … - Sự kiện cửa sổ: Activate, Load, Unload, … Trong hệ điều hành Windows, hook (câu móc) chế cho phép hàm chặn kiện (thông điệp, chuột, phím nhấn) trước đưa đến đối tượng cần xử lý Hàm cho phép thay đổi chí cấm kiện xảy Chúng gọi hàm lọc (filter) phân loại dựa theo loại kiện bị chặn Để gọi hàm lọc, ta cần phải thực trình gắn (attach) vào trình câu móc (như câu móc bàn phím) Việc gắn hay nhiều hàm lọc vào q trình câu móc gọi thiết lập (setting) trình câu móc Nếu q trình câu móc có nhiều hàm lọc, Windows trì chuỗi hàm lọc hàm cài đặt vào gần nằm đầu chuỗi hàm cài đặt lâu nằm cuối chuỗi Nếu kiện xảy làm khởi động q trình câu móc, Windows gọi hàm lọc chuỗi Quá trình câu móc vào kiện sử dụng hàm SetWindowsHookEx hàm UnhookWindowsHookEx dùng để xóa bỏ hàm lọc khỏi q trình Khi q trình câu móc khởi động, Windows gọi hàm chuỗi hàm lọc kết thúc quản lý trình, hàm lọc phía sau khơng xử lý Để thực hàm phía sau chuỗi hàm, Windows cung cấp hàm CallNextHookEx cho phép gọi hàm chuỗi hàm lọc Như vậy, hàm lọc khơng thực hàm CallNextHookEx hàm lọc phía sau khơng thực SetWindowsHookEx: Dùng để thêm hàm lọc vào trình câu móc, gồm có tham số: - idHook: xác định loại hàm câu móc cài đặt Thơng số gồm giá trị sau: Trang 18 Phòng thí nghiệm Mô & Truyền số liệu Thực hành Lập trình hệ thống WH_KEYBOARD: cài đặt hàm câu móc quản lý thơng điệp gởi nhấn phím (ngoại trừ tổ hợp Ctrl – Alt – Del) WH_MOUSE: cài đặt hàm câu móc quản lý thơng điệp điều khiển chuột WH_CALLWNDPROC: cài đặt hàm câu móc quản lý thơng điệp trước hệ thống gởi đến cửa sổ, cho phép xử lý thông điệp mà không thay đổi thơng điệp WH_CALLWNDPROCRET: cài đặt hàm câu móc quản lý thông điệp sau cửa sổ xử lý Loại cho phép thay đổi giá trị trả thơng điệp WH_MSGFILTER: cài đặt hàm câu móc quản lý thơng điệp tạo giống có kiện dialog box, message box, menu hay scroll bar WH_GETMESSAGE: cài đặt hàm câu móc quản lý thông điệp gởi tới hàng đợi WH_CBT: cài đặt hàm câu móc để nhận thơng báo từ ứng dụng CBT WH_DEBUG: cài đặt hàm câu móc để gỡ rối hàm câu móc khác WH_FOREGROUNDIDLE: cài đặt hàm câu móc hàm gọi luồng (thread) foreground ứng dụng rảnh (idle) Quá trình thường sử dụng để thực thi tác vụ có độ ưu tiên thấp luồng ưu tiên rảnh WH_JOURNALPLAYBACK: cài đặt hàm câu móc để gởi thơng điệp lưu hàm câu móc WH_JOURNALRECORD WH_JOURNALRECORD: cài đặt hàm câu móc lưu lại thơng điệp gởi đến hàng đợi WH_KEYBOARD_LL: cài đặt hàm câu móc quản lý kiện bàn phím mức thấp (dùng cho Windows NT/2000/XP) WH_MOUSE_LL: cài đặt hàm câu móc quản lý kiện chuột mức thấp (dùng cho Windows NT/2000/XP) WH_SHELL: cài đặt hàm câu móc cho ứng dụng shell WH_SYSMSGFILTER: cài đặt hàm câu móc quản lý thơng điệp tạo giống có kiện dialog box, message box, menu hay scroll bar Hàm quản lý cho tất ứng dụng desktop - lpfn: Con trỏ đến địa hàm lọc Nếu tham số dwThreadId = hay đến luồng tạo tiến trình (process) khác, tham số lpfn phải đến hàm câu móc thư viện liên kết động (DLL) Ngược lại, lpfn đến hàm câu móc chứa thân tiến trình hành - hMod: handle đến DLL chứa hàm xử lý xác định tham số lpfn Tham số hMod đặt NULL hàm câu móc nằm tiến trình hành - dwThreadId: Trang 19 Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lập trình hệ thống Xác định ID luồng thực q trình câu móc Nếu dwThreadId = 0, hàm câu móc tác động đến tất luồng Ứng dụng dùng hàm GetCurrentThreadId để xác định ID luồng hành UnhookWindowsHookEx: Dùng để xoá hàm lọc khỏi chuỗi xử lý q trình câu móc Hàm lấy handle q trình câu móc trả từ lệnh gọi hàm SetWindowsHookEx trả giá trị TRUE Hàm CallNextHookEx: Dùng để chuyển thông tin câu móc đến hàm câu móc chuỗi xử lý - hHook: handle q trình câu móc, giá trị trả từ lệnh gọi hàm SetWindowsHookEx Thông thường Windows bỏ qua giá trị - nCode: mã q trình câu móc, hàm câu móc dùng mã để xác định phương pháp xử lý thông tin - wParam: xác định tham số xử lý hàm câu móc - lParam: giống wParam Hàm lọc Hàm lọc thường có dạng sau: Function FilterFunc (ByVal nCode wParam As Long, ByVal lParam As Long) As Integer, ByVal Hàm lọc nhận tham số: - nCode: mã q trình câu móc, số ngun xác định hàm lọc, ví dụ loại kiện làm khởi động q trình câu móc Mã xác định hàm lọc xử lý kiện hay gọi hàm DefHookProc Nếu mã câu móc < hàm lọc không xử lý kiện mà gọi hàm DefHookProc để truyền tham số lại cho hàm lọc chuỗi hàm lọc hàm CallNextHookEx - Tham số thứ hai wParam thứ ba lParam chứa thông tin cần thiết cho hàm lọc Mỗi q trình câu móc dùng giá trị wParam lParam khác Các tham số tương ứng hàm lọc ứng với kiện chuột bàn phím cho sau: - Hook bàn phím: nCode: nCode < 0, hàm lọc phải chuyển thông điệp hàm CallNextHookEx mà không xử lý wParam: loại thông điệp (WM_KEYDOWN, WM_SYSKEYDOWN hay WM_SYSKEYUP) lParam: trỏ đến cấu trúc KBDLLHOOKSTRUCTURE Public Type KBDLLHOOKSTRUCT vkCode As Long scanCode As Long flags As Long time As Long Trang 20 WM_KEYUP, Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lập trình hệ thống dwExtraInfo As Long End Type vkCode: mã phím nhấn scanCode: mã quét (phần cứng) flags: Bit =0: nhấn =1: nhấn ALT =1: phím mở rộng (phím F1 – F12, …) =1: nhả =0: không nhấn =0: - Hook chuột: nCode: giống wParam: loại thông điệp (WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN hay WM_RBUTTONUP) lParam: trỏ đến cấu trúc MSLLHOOKSTRUCTURE Public Type MSLLHOOKSTRUCT pt As POINTAPI hWnd As Long wHitTestCode As Long dwExtraInfo As Long End Type Public Type POINTAPI x As Long y As Long End Type pt: toạ độ trỏ chuột hWnd: handle window nhận kiện chuột Trang 21 Phòng thí nghiệm Mơ & Truyền số liệu PHẦN II : I - Thực hành Lập trình hệ thống TIẾN TRÌNH THÍ NGHIỆM HOOK BÀN PHÍM Khởi động Visual Basic Cửa sổ chương trình Visual Basic Thanh công cụ Vùng thiết kế Project Explorer Properties Window - Vùng thiết kế: Thiết kế giao diện chương trình - Project Explorer: Hiển thị tất Form Module có chương trình - Properties Window: Hiển thị cho phép sửa đổi thuộc tính đối tượng - Thanh công cụ: Tạo đối tượng cho Project: Trang 22 Phòng thí nghiệm Mơ & Truyền số liệu - Thực hành Lập trình hệ thống Label Textbox Frame Command Button Check box Option Dùng VB6 tạo giao diện sau: Textbox Name = txtResult MultiLine = True ScrollBars = Both Command Button Name = cmdHook Caption = Start Hook Command Button Name = cmdExit Chương trình cho Form1: Dim handleKeyBoard As Long Private Sub cmdExit_Click() Unload Me End Sub Private Sub cmdhook_Click() If cmdHook.Caption = "Start Hook" Then cmdHook.Caption = "Stop Hook" Trang 23 Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lập trình hệ thống handleKeyBoard = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0) Else UnhookWindowsHookEx handleKeyBoard handleKeyBoard = cmdHook.Caption = "Start Hook" End If End Sub Private Sub Form_Unload(Cancel As Integer) If handleKeyBoard Then UnhookWindowsHookEx handleKeyBoard End Sub - Tạo module (Project > Add Module): Trang 24 Phòng thí nghiệm Mô & Truyền số liệu - Mở module mới: - Mở cửa sổ code Module: Thực hành Lập trình hệ thống Chương trình cho Module1: Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Public Const HC_ACTION = Public Const WM_KEYDOWN = &H100 Public Const WM_SYSKEYDOWN = &H104 Public Const WH_KEYBOARD_LL = 13 Trang 25 Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lập trình hệ thống Public Const WH_KEYBOARD = Public Type KBDLLHOOKSTRUCT vkCode As Long scanCode As Long flags As Long time As Long dwExtraInfo As Long End Type Dim kb_pointer As KBDLLHOOKSTRUCT Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If (nCode = HC_ACTION) Then If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Then CopyMemory kb_pointer, ByVal lParam, Len(kb_pointer) Form1.txtResult.Text = Form1.txtResult.Text + Chr(kb_pointer.vkCode) End If End If LowLevelKeyboardProc = CallNextHookEx(0, nCode, wParam, ByVal lParam) End Function - Lưu Project: File > Save Project (VD: bai3.vbp, bai3.frm, bai3.bas) Thực biên dịch chương trình: File > Make bai3.exe Trang 26 Phòng thí nghiệm Mơ & Truyền số liệu - Thực hành Lập trình hệ thống Thực thi file bai3.exe Thay đoạn in đậm đoạn chương trình sau: If kb_pointer.vkCode = 65 Then LowLevelKeyboardProc = -1 Exit Function Else Form1.txtResult.Text = Form1.txtResult.Text + Chr(kb_pointer.vkCode) End If II - Biên dịch thực thi Sửa đổi chương trình để chặn tất phím số HOOK CHUỘT Dùng VB6 tạo giao diện sau: Label Caption = X pos Label Caption = Y pos Label Caption = Mouse Position Command Button Name = cmdHook Caption = Hook Label Name = lblX Caption = “” Chương trình cho Form1: Private Sub Command1_Click() If Command1.Caption = "Hook" Then SetHook Command1.Caption = "UnHook" Else UnSetHook Command1.Caption = "Hook" End If End Sub Private Sub Form_Unload(Cancel As Integer) Trang 27 Label Name = lblY Caption = “” Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lập trình hệ thống If Command1.Caption = "UnHook" Then UnSetHook End If End Sub Chương trình cho Module1: Type POINTAPI x As Long y As Long End Type Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Public Public Public Public Public Public Public Public Public Const Const Const Const Const Const Const Const Const WH_MOUSE_LL = 14& WH_MOUSE = 7& HC_ACTION = 0& WM_RBUTTONDOWN = &H204 WM_RBUTTONUP = &H205 WM_LBUTTONDOWN = &H201 WM_LBUTTONUP = &H202 WM_MOUSEMOVE = &H200 VK_RBUTTON = &H2 Private lMShook As Long Private bHookEnabled As Boolean Public Function MouseProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim p_cursor As POINTAPI If nCode = HC_ACTION Then If (wParam = WM_RBUTTONUP Or wParam = WM_RBUTTONDOWN) Then MouseProc = -1 Exit Function ElseIf (wParam = WM_LBUTTONUP Or wParam = WM_LBUTTONDOWN) Then GetCursorPos p_cursor Form1.lblX.Caption = Str(p_cursor.x) Form1.lblY.Caption = Str(p_cursor.y) End If End If MouseProc lParam) = CallNextHookEx(lMShook, Trang 28 nCode, wParam, Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lập trình hệ thống End Function Public Function SetHook() If lMShook = Then lMShook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf MouseProc, App.hInstance, 0&) End If If lMShook = Then MsgBox "failed to install hook :" & lMShook & " : " & WH_MOUSE_LL bHookEnabled = False Unload Form1 Exit Function Else bHookEnabled = True End If End Function Public Function UnSetHook() If bHookEnabled Then Call UnhookWindowsHookEx(lMShook) lMShook = End If bHookEnabled = False End Function Public Function InstalledHook() MsgBox " installed hook is :" & lMShook End Function - Viết lại chương trình để hiển thị toạ độ trỏ chuột di chuyển Viết lại chương trình cho hai chế Hook bàn phím chuột cho tác động lên cửa sổ hành Trang 29 ... Project (VD: bai3. vbp, bai3. frm, bai3. bas) Thực biên dịch chương trình: File > Make bai3. exe Trang 26 Phòng thí nghiệm Mơ & Truyền số liệu - Thực hành Lập trình hệ thống Thực thi file bai3. exe Thay... nghiệm Mơ & Truyền số liệu PHẦN II : I - Thực hành Lập trình hệ thống TIẾN TRÌNH THÍ NGHIỆM HOOK BÀN PHÍM Khởi động Visual Basic Cửa sổ chương trình Visual Basic Thanh công cụ Vùng thiết kế Project... hMod đặt NULL hàm câu móc nằm tiến trình hành - dwThreadId: Trang 19 Phòng thí nghiệm Mơ & Truyền số liệu Thực hành Lập trình hệ thống Xác định ID luồng thực trình câu móc Nếu dwThreadId = 0,