1. Trang chủ
  2. » Luận Văn - Báo Cáo

Nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên desktop – viết chương trình nhận dạng này

76 1 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 76
Dung lượng 796,68 KB

Nội dung

BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC PHAN THIẾT BÁO CÁO TỔNG KẾT ĐỀ TÀI NGHIÊN CỨU KHOA HỌC SINH VIÊN NGHIÊN CỨU CÁC PHƯƠNG PHÁP NHẬN DẠNG TỪ DƯỚI CURSOR MOUSE TRÊN DESKTOP – VIẾT CHƯƠNG TRÌNH NHẬN DẠNG NÀY Khoa: Cơng nghệ Thơng tin Nhóm sinh viên: Huỳnh Lê Ngọc Kha Đào Thị Hoàng Nhiên Huỳnh Dương Minh Thư Nguyễn Văn Thuận Giảng viên hướng dẫn: ThS Lê Thanh Bình Thuận, tháng năm 2020 BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC PHAN THIẾT BÁO CÁO TỔNG KẾT ĐỀ TÀI NGHIÊN CỨU KHOA HỌC SINH VIÊN NGHIÊN CỨU CÁC PHƯƠNG PHÁP NHẬN DẠNG TỪ DƯỚI CURSOR MOUSE TRÊN DESKTOP – VIẾT CHƯƠNG TRÌNH NHẬN DẠNG NÀY Khoa: Cơng nghệ Thơng tin Nhóm sinh viên: Huỳnh Lê Ngọc Kha Đào Thị Hoàng Nhiên Huỳnh Dương Minh Thư Nguyễn Văn Thuận Giảng viên hướng dẫn: ThS Lê Thanh Bình Thuận, tháng năm 2020 MỤC LỤC LỜI MỞ ĐẦU CHƯƠNG 1: TÌM HIỂU VỀ LẬP TRÌNH WINDOWS I Khái qt lập trình Windows II Thông điệp xử lý thông điệp III Giao diện thiết bị đồ họa GDI 11 IV Cửa sổ Windows 15 V Chương trình Windows tiếp nhận thơng điệp chuột CHƯƠNG 2: TÌM HIỂU VỀ HOOK 22 26 - Chuỗi hook 27 - Thủ tục hook 27 - Các loại hook 28 - Sử dụng hook 30 - Hook Windows 3.x 31 - Giới thiệu số hàm liên quan đến hook 33 CHƯƠNG 3: KỸ THUẬT OVERRIDE HÀM API 36 I Khái quát kỹ thuật override 37 II Lý sử dụng kỹ thuật override lập trình Windows 37 III Cơ chế hoạt động quản lý nhớ Windows 16bits 38 IV Cơ chế hoạt động quản lý nhớ Windows 32bits 41 V Hiện thực kỹ thuật override Windows 16bits 45 VI Một số hàm sử dụng kỹ thuật override 50 CHƯƠNG 4: KẾT XUẤT VĂN BẢN TRONG WINDOWS 54 I Kết xuất văn Windows 55 II Các hàm để kết xuất văn 55 CHƯƠNG 5: PHÂN TÍCH VÀ THIẾT KẾ CHƯƠNG TRÌNH 66 I Phân tích vấn đề 67 II Thiết kế chương trình 68 III Giới thiệu số hàm có liên quan 78 IV Giới thiệu số cấu trúc liệu có liên quan 92 KẾT QUẢ VÀ HƯỚNG PHÁT TRIỂN 97 LỜI MỞ ĐẦU Ngày nay, công việc hàng ngày liên quan đến sống diễn máy tính Từ việc soạn thảo văn bản, gởi nhận thông tin đến việc tra cứu, truy cập thông tin từ hệ thống mạng máy tính tồn cầu Internet người sử dụng công việc thường ngày phổ biến Từ đó, phát sinh vấn đề người sử dụng cần tìm hiểu ý nghĩa từ, câu cần phải dịch đoạn văn bản, file liệu tiếng Việt ngược lại Đây nhu cầu cần thiết xảy thường xuyên nhiều người, nhận dạng từ đặc biệt nhận dạng từ hình mơi trường Windows việc làm cần thiết có ý nghĩa thực tế Kết việc nhận dạng từ dùng để xây dựng nên ứng dụng khác chẳng hạn từ điển tra cứu theo kiểu tương tác trực tiếp thuận tiện cho người sử dụng theo cách cho dù ứng dụng cần tra cứu thao tác trực tiếp ứng dụng dùng tức cần click chuột vào không cần phải mở từ điển tra cứu từ theo kiểu cổ điển Trong giai đoạn đầu Nghiên Cứu Khoa Học nghiên cứu số vấn đề quan trọng có ý nghĩa việc thực yêu cầu đặt đề tài Đề tài tập trung nhận dạng từ dạng text desktop môi trường Windows xuất kết Trong thời gian làm Nghiên Cứu Khoa Học nhóm sinh viên tiến hành nghiên cứu chế hoạt động quản lý hệ điều hành Windows Nghiên cứu phương thức lập trình mơi trường Windows phương tiện mà Windows hỗ trợ lập trình Tham khảo nghiên cứu kỹ thuật override hàm giao tiếp Windows chế độ 16 bit 32 bit Nghiên cứu cách xử lý thông điệp Windows tìm hiểu cách kết xuất văn bản, chế độ ánh xạ, vấn đề tọa độ cách xử lý văn Trên sở bước đầu chúng tơi xây dựng xong ứng dụng có khả nhận dạng từ Windows 16 bit viết ngôn ngữ Visual C++ version 1.5 hướng phát triển thời gian tới thực Win32 Báo cáo điểm qua nội dung mà chúng tơi nghiên cứu tìm hiểu thời gian qua Sau phần giới thiệu chi tiết chương trình từ khâu phân tích-thiết kế phần chương trình nguồn cuối nêu vấn đề tồn hướng phát triển tương lai Chương 1: TÌM HIỂU VỀ LẬP TRÌNH WINDOWS I - KHÁI QUÁT VỀ LẬP TRÌNH TRONG WINDOWS: 1.1 - Khái quát lập trình Windows: Mơi trường lập trình Windows dựa hàm API (Application Programmer Interface), có chức ngắt bảng vector ngắt DOS, thân thiện chỗ cách gọi hàm API giống hệt cách gọi hàm ngơn ngữ cấp cao, hàm có tên gọi hẳn hoi, tên gọi thường đặt phù hợp với cơng dụng hàm (mặc dù có dài dịng) từ tạo khả gợi nhớ cao Với Windows, người lập trình khơng cịn phải lập trình theo kiểu assembly mà lập trình theo kiểu ngôn ngữ cấp cao, hoạt động máy mức thấp từ hàm API trở xuống thuộc phạm vi Windows, Windows khơng khuyến khích việc ứng dụng can thiệp vào lĩnh vực Bù lại, hàm API, hỗ trợ hiệu cho người lập trình, giúp khai thác khả thiết bị triệt để, dễ dàng tiện lợi hết Có thể nói Windows mở cho người lập trình khơng gian rộng lớn để phát triển ứng dụng, hạn chế không gian phát triển hệ thống Điều dẫn đến hệ ứng dụng tạo dễ dàng, quan trọng hệ thống chạy ổn định hơn, không bị treo lỗi ứng dụng, xâm nhập, khó khăn người lập trình muốn trực tiếp điều khiển hoạt động máy phát triển lập trình hệ thống - Tìm hiểu hàm Windows API: Windows hệ điều hành đa nhiệm (multitasking) mà qua ứng dụng mơi trường Windows giao tiếp với user thông qua hay nhiều giao diện Để truy cập giao diện ứng dụng xây dựng mơi trường Windows sử dụng tập hàm gọi giao diện chương trình ứng dụng API (Application Program Interface) Chương trình người sử dụng gọi tới hàm API để truy cập tới tài nguyên Windows GDI phận API, giao diện thiết bị đồ họa GDI (Graphic Device Interface) có nhiệm vụ trì độc lập Windows thiết bị đồ họa hay gọi khả độc lập thiết bị (device independent) tức cho phép Windows làm việc với nhiều kiểu thiết bị đồ họa khác 1.2 - Thư viện liên kết động DLL (Dynamic Link Library): Thư viện liên kết động tập tin Windows lưu dạng nhị phân chứa hàm mà ứng dụng Windows sử dụng Nét đặc trưng DLL sử dụng nhiều ứng dụng thời điểm hay nói cách khác thư viện liên kết động lúc gọi nhiều chương trình DLL liệu chia sẻ (shared data) Có loại DLL khác nhau: - Thư viện liên kết động API: thuộc hệ thống Windows, cài hệ điều hành có sẵn Chúng nạp Windows khởi động - Thư viện liên kết động third party: công ty khác tạo môi trường Windows, hỗ trợ thêm cơng tác lập trình Windows - Thư viện liên kết động tạo Windows sử dụng cấu trúc thư viện liên kết động DLL (Dynamic Link Library) nhằm mục đích khơng chép khối lượng lớn mã vào chương trình thư viện thơng thường Nhờ cấu trúc động DLL nên chương trình truy cập thư viện thời gian thực thi Các hàm API Windows giữ dạng hỗn hợp số DLL Trong trình dịch gặp lệnh gọi hàm API từ chương trình ứng dụng chương trình dịch khơng thêm mã vào module thực mà thêm lệnh liên kết (chứa tên DLL bên có hàm cần nạp) tên hàm Khi thực thi chương trình hàm API thực nạp vào nhớ để thực Cùng với phát triển Windows phát triển lập trình hướng đối tượng, để hỗ trợ cho việc lập trình hướng đối tượng, Microsoft cung cấp cho người lập trình thư viện lớp để phát triển ứng dụng hướng đối tượng gọi MFC (Microsoft Foundation Classes), nội dung bao gồm thơng tin lớp chuẩn hóa lớp application; document; view; OLE; cửa sổ; nút bấm; text; v.v…, lớp thứ liên quan đến (bao gồm liệu chương trình xử lý nó) làm hồn chỉnh, người lập trình việc lấy sử dụng, thêm bớt tính đặc trưng cho đối tượng Mục tiêu MFC hệ thống hóa hàm API, cung cấp thể thức gọi gọn hàm API, cung cấp “khung làm việc” (framework) cực mạnh để người lập trình khơng cần phải quan tâm đến đoạn chương trình thuộc “thủ tục” mà cần quan tâm đến phần cốt lõi để đạt mục đích II - THƠNG ĐIỆP VÀ XỬ LÝ THƠNG ĐIỆP: 1.3 - Khái niệm: Lập trình mơi trường Windows khác với lập trình mơi trường khác điểm lập trình Windows ln gắn liền với thông điệp Mọi hoạt động xảy chương trình Windows thơng qua thông điệp Thông điệp hệ thống báo cho ứng dụng biết tác động từ bên ngồi vào hệ thống Windows Một cửa sổ gởi thông điệp cho cửa sổ khác cửa sổ đáp ứng lại thông điệp cách gởi thông điệp khác cho cửa sổ khác Trong Windows có loại thơng điệp bản: - Những thơng điệp tổng qt: có mã nhận diện mang tiền tố WM_ coi phần lớn ứng dụng Windows cung cấp hàm để giải - Những control notification: thông điệp WM_COMMAND chuyển từ cửa sổ tới cửa sổ bố mẹ - Những nút lệnh: thơng điệp WM_COMMAND phát từ trình đơn, từ nút điều khiển Đây loại thông điệp yêu cầu ứng dụng phải thực cơng việc 1.4 - Gởi thông điệp: Windows cho phép ứng dụng gởi thơng điệp cho mình, cho ứng dụng khác cho hệ thống Có hàm Windows API để gởi thông điệp đi: 1.4.1 a) Hàm SendMessage: Cú pháp: LRESULT SendMessage(hwnd, uMsg, wParam, lParam) HWND hwnd; // handle cửa sổ nhận (đích) UINT uMsg; // thông điệp để gởi WPARAM wParam; // thông số thông điệp LPARAM lParam; // thông số thông điệp thứ hai - Hàm SendMessage gởi thông điệp tới hay nhiều cửa sổ Hàm gọi thủ tục cửa sổ cho cửa sổ không trở lúc thủ tục cửa sổ xử lý thông điệp - Giá trị trả về: cho biết kết xử lý thông điệp phụ thuộc vào thông điệp gởi 1.4.2 b) Hàm PostMessage: - Cú pháp: BOOL PostMessage(hwnd, uMsg, wParam, lParam) HWND hwnd; // handle của sổ đích UINT uMsg; // thơng điệp gởi WPARAM wParam; // thông số thông điệp LPARAM lParam; // thông số thông điệp thứ hai - Hàm PostMessage gởi (đặt) thông điệp vào hàng thông điệp cửa sổ trở mà không đợi cửa sổ tương ứng xử lý thông điệp Những thông điệp hàng thông điệp lấy cách gọi hàm SetMessage hay PeekMessage - Giá trị trả về: trả khác thành công, ngược lại 1.4.3 c) Hàm SendDlgItemMessage: - Cú pháp: LRESULT SendDlgItemMessage(hwndDlg,idDlgItem,uMsg,wParam,lParam) HWND hwndDlg; // handle hộp hội thoại int idDlgItem; // mã nhận diện ô điều khiển nhận thông điệp UINT uMsg; // thông điệp gởi WPARAM wParam; // thông số thông điệp LPARAM lParam; // thông số thông điệp thứ hai - Hàm SendDlgItemMessage gởi thông điệp tới điều khiển hộp hội thoại - Giá trị trả về: cho biết kết xử lý thông điệp phụ thuộc vào thông điệp gởi 1.5 - Vịng lặp thơng điệp: Một thread process đẩy thông điệp khỏi hàng đợi cách dùng vịng lặp thơng điệp Vịng loop ứng dụng đặt cuối hàm WinMain() ứng dụng Vịng lặp thơng điệp có dạng sau: while GetMessage(&msg,NULL,0,0) { TranslateMessage(&msg); DispatchMessage(&msg); } Sau Sơ đồ dịng thơng điệp: Hardware Event Occur System Message Queue System Dispatcher System Dispatcher Thread1 Message Queue Thread1 Hook Thread2 Message Queue Thread2 Hook Thread3 Message Queue Thread3 Hook GetMessage() TranslateMessage() Dispatch Message() GetMessage() TranslateMessage() Dispatch Message() GetMessage() TranslateMessage() Dispatch Message() WndProc() WndProc() WndProc() DefWndProc() DefWndProc() DefWndProc() xác định cof1 hay khơng background bị xóa vùng cập nhật xử lý Nếu TRUE background bị xóa BeginPaint gọi Nếu FALSE background khơng đổi - Giá trị trả về: hàm không trả giá trị fErase 3.3.3 3) Hàm UpdateWindow: Hàm cập nhật vùng client cửa sổ cách gởi thông điệp WM_PAINT trực tiếp tới cửa sổ vùng cập nhật cho cửa sổ không trống Hàm gởi thông điệp WM_PAINT trực tiếp tới thủ tục cửa sổ cửa sổ bỏ qua hàng ứng dụng Nếu vùng cập nhật trống khơng có thơng điệp gởi - Cú pháp: void UpdateWindow(hwnd) HWND hwnd; - Thông số: hwnd cửa sổ cần cập nhật - Giá trị trả về: hàm không trả giá trị 3.3.4 – Hàm đặt hook SetWindowsHookEx: - Hàm SetWindowsHookEx cài đặt thủ tục hook định nghĩa ứng dụng vào chuỗi hook Cài đặt thủ tục hook để quản lý hệ thống cho kiểu kiện Những kiện tổ chức với thread đặc biệt hay với tất thread hệ thống - Cú pháp: HHOOK SetWindowsHookEx( Int idHook, // kiểu hook để cài đặt HOOKPROC lpfn, // địa thủ tục hook HINSTANCE hMod, // handle tới thể ứng dụng DWORD dwThreadId // nhận dạng thread để đặt hook ); - Các thông số: Idhook kiểu thủ tục hook đặt, gồm giá trị sau: WH_CALLWNDPROC đặt thủ tục hook quản lý thông điệp trước lúc hệ thống gởi chúng tới cửa sổ đích WH_CALLWNDPROCRET đặt thủ tục hook quản lý thông điệp sau chúng xử lý thủ tục cửa sổ đích WH_CBT đặt thủ tục hook nhận thơng báo có ích tới ứng dụng huấn luyện sở tính tốn (CBT) WH_DEBUG đặt thủ tục hook có ích cho việc debug thủ tục hook khác WH_FOREGROUNDIDLE đặt thủ tục hook gọi thread foreground ứng dụng trở thành không dùng đến Hook có ích cho hoạt động nhiệm vụ (task) độ ưu tiên thấp thời gian không dùng đến WH_GETMESSAGE đặt thủ tục hook quản lý thông điệp post tới hàng thông điệp WH_JOURNALPLAYBACK đặt thủ tục hook post thông điệp ghi trước thủ tục hook WH_JOURNALRECORD WH_JOURNALRECORD đặt thủ tục hook ghi thông điệp đầu vào post tới hàng thông điệp hệ thống Hook có ích cho việc ghi macro WH_KEYBOARD đặt thủ tục hook quản lý thông điệp keystroke WH_KEYBOARD_LL Windows NT: đặt thủ tục hook quản lý kiện nhập vào từ keyboard mức thấp WH_MOUSE đặt thủ tục hook quản lý thông điệp chuột WH_MOUSE_LL Windows NT: đặt thủ tục hook quản lý kiện đầu vào chuột mức thấp WH_MSGFILTER đặt thủ tục hook quản lý thông điệp kết sinh kết cuả kiện đầu vào dialog box, message box, menu hay scroll bar WH_SHELL đặt thủ tục hook quản lý thơng điệp nhận thơng báo hữu ích để shell ứng dụng WH_SYSMSGFILTER đặt ứng dụng thông điệp kết sinh kết kiện đầu vào dialog box, message box, menu hay scroll bar Thủ tục hook quản lý thông điệp cho tất ứng dụng hệ thống lpfn trỏ tới thủ tục hook Nếu dwThreadId hay đặc tả danh hiệu thread tạo trình khác, lpfn phải tới thủ tục hook DLL Cịn khơng, lpfn trỏ tới thủ tục hook code đươc tổ chức với trình thời hMode handle tới DLL chứa thủ tục hook trỏ tới lpfn hMode phải đặt NULL dwThread đặc tả thread tạo trình hành thủ tục hook code tổ chức với trình hành dwThreadId đặc tả danh hiệu thread với thủ tục hook tổ chức, thủ tục hook tổ chức với tất thread tồn Giá trị trả về: handle tới thủ tục hook thành công NULL thất bại - Ghi chú: lỗi xảy thông số hMode NULL dwThreadId = hay đặc tả danh hiệu thread tạo trình khác Tầm vực hook phụ thuộc vào kiểu hook Một vài hook đặt với tầm vực hệ thống, hook khác đặt cho thread đặc biệt, danh sách: Hook Tầm vực WH_CALLWNDPROC thread hay system WH_CALLWNDPROCRET thread hay system WH_CBT thread hay system WH_DEBUG thread hay system WH_FOREGROUNDIDLE thread hay system WH_GETMESSAGE thread hay system WH_JOURNALPLAYBACK system WH_JOURNALRECORD system WH_KEYBOARD thread hay system WH_KEYBOARD_LL thread hay system WH_MOUSE thread hay system WH_MOUSE_LL thread hay system WH_MSGFILTER thread hay system WH_SYSMSGFILTER thread hay system WH_SHELL system Với loại hook đặc tả hook thread gọi trước đến hook hệ thống Hook hệ thống tài nguyên chia sẻ đặt ảnh hưởng lên tất ứng dụng Tất hàm hook hệ thống phải thư viện Hook hệ thống nên xử lý cho ứng dụng có mục đích đặc biệt hay để sử dụng trợ giúp (aid) đặc biệt debug ứng dụng Các thư viện khơng cần hook nên gở bỏ thủ tục hook 3.3.5 - Hàm WindowFromPoint: - Hàm lấy handle cửa sổ chứa điểm xác định - Cú pháp: HWND WindowFromPoint ( POINT Point // cấu trúc điểm ); - Thông số: Point : điểm kiểm tra - Giá trị trả về: Là handle cửa sổ chứa điểm Nếu khơng có cửa sổ chứa điểm giá trị trả NULL Nếu điểm nằm điều khiển text tĩnh (static text control) giá trị trả handle cửa sổ nằm bên điều khiển text tĩnh - Ghi chú: Hàm WindowFromPoint không lấy handle cửa sổ bị che hay không hoạt dộng được, điểm cửa sổ Một ứng dụng sử dụng hàm ChildWindowFromPoint cho việc tìm kiếm khơng có giới hạn Hàm u cầu tối thiểu Windows 95, Header khai báo winuser.h, sử dụng thư viện user32.lib 3.3.6 – Hàm ChildWindowFromPoint: - Hàm ChildWindowFromPoint xác định rõ cửa sổ thuộc cửa sổ cha mẹ chứa điểm cho - Cú pháp: HWND ChildWindowFromPoint ( HWND hWndParent, // handle cửa sổ cha mẹ POINT Point // cấu trúc tọa độ điểm ); - Thông số: hWndParent Handle cửa sổ cha mẹ Point Cấu trúc POINT định nghĩa tọa độ client điểm kiểm tra - Giá trị trả về: Là handle cửa sổ chứa điểm contains the point trường hợp cửa sổ bị che hay hoạt động hidden or disabled Nếu điểm nằm cửa sổ cha mẹ giá trị trả NULL Nếu điểm cửa sổ cha mẹ khơng cửa sổ trả handle cửa sổ cha mẹ - Ghi chú: Hệ thống trì danh sách nội, chứa handle cửa sổ tổ chức cửa sổ cha mẹ Thứ tư handle danh sách phụ thuộc vào trật tự Z cửa sổ Nếu có nhiều cửa sổ chứa điểm hệ thống trả handle cửa sổ danh sách mà có chứa điểm Hàm đòi hỏi tối thiểu Windows 95, Header: khai báo winuser.h, sử dụng Import Library user32.lib 3.3.7 – Hàm ChildWindowFromPointEx: - Hàm ChildWindowFromPointEx xác định rõ cửa sổ thuộc cửa sổ cha mẹ chứa điểm Hàm phớt lờ cửa sổ khơng nhìn thấy, khơng thể hoạt động suốt - Cú pháp: HWND ChildWindowFromPointEx( HWND hwndParent, // handle cửa sổ cha mẹ POINT pt, // cấu trúc tọa độ điểm UINT uFlags // cờ bỏ quãng ); - Thông số: hwndParent Handle cửa sổ cha mẹ pt cấu trúc POINT định nghĩa tọa độ client điểm kiểm tra cho biết cửa sổ bị bỏ, kết hợp giá trị sau: Giá trị Ý nghĩa CWP_ALL Không bỏ cửa sổ CWP_SKIPINVISIBLE Bỏ cửa sổ khơng nhìn thấy CWP_SKIPDISABLED Bỏ cửa sổ khơng thể hoạt động CWP_SKIPTRANSPARENT Bỏ cửa sổ suốt - Giá trị trả về: Là handle cửa sổ chứa điểm bắt gặp tiêu chuẩn (critia) đặc tả uFlags Nếu điểm cửa sổ cha mẹ không cửa sổ bắt gặp tiêu chuẩn giá trị trả handle cửa sổ cha mẹ Nếu điểm nằm cửa sổ cha mẹ hay hàm thất bại giá trị trả NULL - Ghi chú: Hệ thống trì danh sách nội chứa handle cửa sổ tổ chức cửa sổ cha mẹ Thứ tự handle danh sách phụ thuộc vào trật tự Z cửa sổ Nếu có nhiều cửa sổ chứa điểm hệ thống trả handle cửa sổ danh sách chứa điểm bắt gặp tiêu chuẩn uFlags Hàm đòi hỏi tối thiểu Windows 95, Header: khai báo winuser.h, sử dụng Import Library user32.lib uFlags 3.3.8 - Hàm GetWindowText: - Hàm GetWindowText chép text tiêu đề cửa sổ đặc tả (nếu có một) vào vùng đệm Nếu cửa sổ đặc tả điều khiển text điều khiển chép Tuy nhiên, GetWindowText lấy text điều khiển ứng dụng khác - Cú pháp: int GetWindowText( HWND hWnd, // handle cửa sổ hay điều khiển có chứa text LPTSTR lpString, // địa vùng đệm cho text int nMaxCount // số cực đại ký tự để chép ); - Thông số: hWnd Handle cửa sổ hay điều khiển có chứa text lpString Pointer tới vùng đệm nhận text nMaxCount số lượng cực đại ký tự chép tới vùng đệm tính ln ký tự, NULL Nếu đoạn text vượt giới hạn bị cắt bớt - Giá trị trả về: Nếu thành cơng trả độ dài ký tự chuỗi chép khơng tính ký tự rỗng cuối chuỗi Nếu cửa sổ khơng có tiêu đề hay đoạn text, hay tiêu đề rỗng hay handle cửa sổ tiêu đề khơng hợp lệ giá trị trả zero Hàm lấy đoạn text edit control ứng dụng khác - Ghi chú: Nếu cửa sổ đích thuộc sở hữu q trình hành, hàm GetWindowText tạo nên thông điệp WM_GETTEXT để gởi tới điều khiển hay cửa sổ đặc tả Nếu cửa sổ đích sở hữu q trình khác có đầu đề (caption) hàm GetWindowText lấy phần text caption cửa sổ Nếu cửa sổ khơng có caption giá trị trả chuỗi rỗng Hàm đòi hỏi tối thiểu Windows 95, Header: khai báo winuser.h, sử dụng Import Library user32.lib 3.3.9 - Hàm MouseProc: Thủ tục hook MouseProc hàm callback định nghĩa thư viện hay định nghĩa ứng dụng sử dụng hàm SetWindowsHookEx Hệ thống gọi hàm ứng dụng gọi hàm GetMessage hay PeekMessage có thơng điệp chuột xử lý Kiểu HOOKPROC định nghĩa pointer trỏ tới hàm callback MouseProc placeholder cho tên hàm định nghĩa ứng dụng hay tên hàm định nghĩa thư viện - Cú pháp: LRESULT CALLBACK MouseProc ( Int nCode, // hook code WPARAM wParam, // danh hiệu thông điệp LPARAM lParam // tọa độ chuột ); - Thông số: nCode code thủ tục hook sử dụng để định làm để xử lý thơng điệp, có giá trị: Giá trị Ý nghĩa HC_ACTION wParam lParam chứa thông tin thông điệp chuột HC_NOREMOVE wParam lParam chứa thông tin thông điệp chuột, thơng điệp chuột khơng bị xóa khỏi hàng message Nếu nCode nhỏ thủ tục hook phải chuyển thông điệp tới hàm CallNextHookEx không cần xử lý thêm nên trả giá trị trả CallNextHookEx wParam chứa danh hiệu thông điệp chuột lParam pointer trỏ tới cấu trúc MOUSEHOOKSTRUCT - Giá trị trả về: Nếu nCode < trả giá trị CallNextHookEx trả nCode >= thủ tục hook không xử lý thông điệp đề nghị bạn gọi CallNextHookEx trả giá trị trả ngược lại ừng dụng khác đặt hook WM_MOUSE không nhận - thông báo hook đối xử xác kết Nếu thủ tục hook xử lý thơng điệp trả giá trị khác để ngăn chặn hệ thống chuyển thông điệp tới thủ tục cửa sổ đích - Ghi chú: Một ứng dụng đặt thủ tục hook cách đặc tả kiểu hook WH_MOUSE địa thủ tục hook gọi tới hàm SetWindowsHookEx Thủ tục hook phải không đặt hàm callback JournalPlayBackProc 3.3.10 10 - Hàm RedrawWindow: Hàm RedrawWindow cập nhật hình chữ nhật hay vùng đưa vào vùng client cửa sổ - Cú pháp: BOOL RedrawWindow( hwnd, lprcUpdate, hrgnUpdate, fuRedraw) HWND hwnd; const RECT FAR* lprcUpdate; HRGN hrgnUpdate; UINT fuRedraw; - Thông số: hwnd Cửa sổ cần vẽ lại Nếu NULL cửa sổ desktop cập nhật lprcUpdate tới cấu trúc RECT chứa tọa độ hình chữ nhật cập nhật Thông số bị phớt lờ hrgnUpdate chứa handle vùng hợp lệ hrgnUpdate vùng cập nhật Nếu hrgnUpdate lprcUpdate NULL tồn vùng client cửa sổ cập nhật fuRedraw hay nhiều cờ vẽ lại, kết hợp nhiều cờ Các cờ sau sử dụng để làm hiệu lực vùng cửa sổ: RDW_ERASE làm cho cửa sổ nhận thông điệp WM_ERASEBKGND cửa sổ vẽ lại Cờ RDW_INVALIDATE phải xác định khơng cờ RDW_ERASE khơng có tác dụng RDW_FRAME làm cho vùng vùng non-client cửa sổ mà giao với vùng cập nhật nhận thông điệp WM_NCPAINT Cờ RDW_INVALIDATE phải xác định không RDW_FRAME không ảnh hưởng Thông điệp thường không gởi suốt thực thi hàm RedrawWindow trừ RDW_UPDATENOW hay RDW_ERASENOW xác định RDW_INTERNALPAINT làm cho WM_PAINT gởi (send) tới cửa sổ mà không quan tâm cửa sổ chứa vùng hợp lệ hay không RDW_INVALIDATE làm hiệu lực lprcUpdate hay hrgnUpdate (chỉ chúng có lẽ khơng NULL) Nếu hai NULL, tồn cửa sổ bị hiệu lực Những cờ sau làm có hiệu lực vùng cửa sổ: RDW_NOERASE chặn thông điệp WM_ERASEBKGND xảy RDW_NOFRAME chặn thông điệp WM_NCPAINT xảy Cờ phải sử dụng với RDW_VALIDATE sử dụng điển hình với RDW_NOCHILDREN Sự chọn lựa để sử dụng phải cẩn thận làm cho phần cửa sổ vẽ RDW_NOINTERNALPAINT chặn thông điệp nội WM_PAINT Cờ không ảnh hưởng WM_PAINT gây kết từ vùng hợp lệ RDW_VALIDATE làm hợp lệ lprcUpdate hay hrgnUpdate (chỉ có lẻ khơng NULL) Nếu hai NULL, tồn cửa sổ hợp lệ Cờ không ảnh hưởng tới thông điệp nội WM_PAINT Những cờ điều khiển việc vẽ xảy Khơng có vẽ thực hàm RedrawWindow trừ mẫu xác định RDW_ERASENOW làm cho cửa sổ bị tác dụng (như xác định cờ RDW_ALLCHILDREN RDW_NOCHILDREN) nhận thông điệp WM_NCPAINT WM_ERASEBKGND ,Nếu cần thiết trước lúc hàm trả WM_PAINT bị trì hỗn RDW_UPDATENOW làm cho cửa sổ bị tác dụng (như xác định cờ RDW_ALLCHILDREN RDW_NOCHILDREN) nhận thông điệp WM_NCPAINT, WM_ERASEBKGND WM_PAINT Nếu cần thiết trước lúc hàm trả - Mặc định, cửa sổ bị tác dụng hàm RedrawWindow phụ thuộc việc cửa sổ có kiểu WS_CLIPCHILDREN hay khơng Những cửa sổ cửa sổ WS_CLIPCHILDREN không bị ảnh hưởng; Tuy nhiên cửa sổ khơng WS_CLIPCHILDREN làm có hiệu lực đệ quy hay làm hiệu lực cửa sổ WS_CLIPCHILDREN bắt gặp Các cờ sau điều khiển cửa sổ bị ảnh hưởng hàm RedrawWindow: RDW_ALLCHILDREN gồm cửa sổ (nếu co) hoạt động vẽ RDW_NOCHILDREN loại trừ cửa sổ (nếu có) khỏi hoạt động vẽ - Giá trị trả về: khác thành công, ngược lại - Chú ý: Khi hàm RedrawWindow dùng để làm hiệu lực vùng cửa sổ desktop cửa sổ desktop khơng nhận thơng điệp WM_PAINT Để vẽ lại desktop ứng dụng sử dụng cờ RDW_ERASE để sinh thông điệp WM_ERASEBKGND 3.3.11 11 - Hàm GetViewportOrgEx: Hàm GetViewportOrgEx lấy tọa độ x, y origin viewport tổ chức với DC - Cú pháp: BOOL GetViewportOrgEx(hdc, lpPoint) HDC hdc; POINT FAR* lpPoint; - Thông số: hdc xác định device context lpPoint Points tới địa cấu trúc POINT Origin viewport (trong tọa độ thiết bị) đặt cấu trúc - Giá trị trả về: khác thành công, ngược lại 3.3.12 12 - Hàm GetDCOrg: Hàm GetDCOrg lấy tọa độ origin dịch cuối cho DC Origin xác định offset sử dụng Windows để dịch tọa độ thiết bị sang tọa độ client cho điểm cửa sổ ứng dụng Origin dịch cuối liên quan với origin vật lý hình - Cú pháp: DWORD GetDCOrg(hdc) HDC hdc; // handle of device context - Thông số: hdc device context mà origin lấy - Giá trị trả về: word thấp giá trị trả chứa tọa độ x word cao chứa toạ độ y origin dịch cuối hệ toạ độ thiết bị hàm thành công 3.3.13 13 - Hàm GetClientRect: Hàm GetClientRect tọa độ client vùng client cửa sổ Tọa độ client xác định góc trái-trên phải-dưới vùng client Bởi tọa độ client liên quan đến góc trái-trên vùng client cửa sổ nên tọa độ góc trái-trên (0,0) - Cú pháp: void GetClientRect(hwnd, lprc) HWND hwnd; // handle of window RECT FAR* lprc; // address of structure for rectangle - Thông số: hwnd Cửa sổ mà tọa độ client lấy lprc tới cấu trúc RECT nhận tọa độ client Giá trị left top 0, right bottom chứa chiều rộng chiều cao cửa sổ - Giá trị trả về: không trả giá trị 3.3.14 14 – Các thơng điệp để vẽ lại hình: Các thơng điệp gởi đến cửa sổ cho hàm SendMessage khiến cho ứng dụng quản lý cửa sổ vẽ lại cửa sổ 3.3.14.1 Thơng điệp WM_PAINT: Mặt cửa sổ bị thay đổi liên tục (bởi lệnh resize, đóng mở dialog box…) khơng cập nhật bị biến dạng nên Windows dùng thông điệp WM_PAINT để tô vẽ lại hình Có nhiều tình làm cho Windows phát thông điệp WM_PAINT: - Trước hết người sử dụng chạy chương trình - Sau cửa sổ co giản hay hoàn nguyên sau cửa sổ bị che phủ (một phần hay toàn phần) cửa sổ khác tức phần cửa sổ bị che không thấy vẽ lại cho thấy - Gởi thông điệp WM_PAINT cách làm hiệu lực vùng client (invalidating) gọi hàm InValidateRect() WM_PAINT: Hdc = (HDC) wParam ; // DC để vẽ Hdc tới DC để vẽ, NULL dùng DC có sẵn, hdc sử dụng vài điều khiển chung để vẽ DC khác DC có sẵn Các cửa sổ khác phớt lờ thơng số Trị trả về: ứng dụng trả xử lý thơng điệp 3.3.14.2 Thơng điệp WM_NCPAINT: Một ứng dụng gởi thông điệp tới cửa sổ khung (frame) phải vẽ lại Khung cửa sổ vùng client area WM_NCPAINT: Hrgn = (HRGN) wParam ; // handle update region Tham số: Hrgn giá trị wParam tới update region xén tới frame cửa sổ, wParam = tồn frame cửa sổ cần cập nhật Giá trị trả về: ứng dụng trả giá trị xử lý thơng điệp Ghi chú: clipping region cửa sổ ln hình chữ nhật hình dạng frame thay đổi 3.4 Giới thiệu số cấu trúc liệu có liên quan: Các cấu trúc liệu cấu trúc chuẩn Windows 3.1, định nghĩa file WINDOWS.H 3.4.1 - Cấu trúc TEXTMETRIC: Cấu trúc TEXTMETRIC chứa thông tin font vật lý Tất kích thước đưa đơn vị luận lý tức chúng phụ thuộc vào chế độ ánh xạ hành ngữ cảnh hình Nội dung ý nghĩa liệu cấu trúc trình bày chương 4: Kết xuất văn 3.4.2 – Cấu trúc POINT: - Dùng để định nghĩa tọa độ x, y điểm - Cú pháp: typedef struct tagPOINT { LONG x; LONG y; } 3.4.3 – Cấu trúc STRUCT: - Định nghĩa tọa độ góc upper-left lower-right hình chữ nhật - Cú pháp: typedef struct tagRECT { LONG LONG LONG LONG } RECT; left; top; right; bottom; 3.4.4 – Cấu trúc PAINTSTRUCT: - Dùng chứa thông tin dùng để tô vẽ client area thuộc cửa sổ - Cú pháp: typedef struct tagPAINTSTRUCT { HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BYTE fIncUpdate; BYTE rgbReserved[16]; } PAINTSTRUCT; - Tham số: hdc handle DC cần vẽ fErase cho biết background có vẽ lại hay khơng, khác tơ vẽ cịn ngược lại khơng vẽ rcPaint góc upper-left lower-right hình chữ nhật vẽ fRestore fIncUpdate dành riêng cho sử dụng nội Windows dành riêng cho sử dụng nội Windows RgbResersed[16] khối ký ức dành riêng cho sử dụng nội Windows 3.4.5 – Cấu trúc EVENTMSG: - Chứa thông tin từ hàng ứng dụng Windows, sử dụng để lưu trữ thông tin thông điệp cho hàm callback JornalPlaybackProc - Cú pháp: typedef struct tagEVENTMSG { UINT message; UINT paramL; UINT paramH; DWORD time; } EVENTMSG; - Thông số: message paramL paramH time thông điệp thông tin thêm vào thơng điệp Nghĩa xác phụ thuộc vào giá trị thông điệp thông tin thêm vào thông điệp Nghĩa xác phụ thuộc vào giá trị thơng điệp thời điểm mà thông điệp post 3.4.6 – Cấu trúc MSG: - Chứa thông tin từ hàng ứng dụng cửa sổ - Cú pháp: typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG; - Thông số: hwnd cửa sổ nhận thông điệp message ố thông điệp wParam thông tin thêm vào thơng điệp Nghĩa xác phụ thuộc vào giá trị thông điệp lParam thông tin thêm vào thơng điệp Nghĩa xác phụ thuộc vào giá trị thông điệp time thời điểm thông điệp post pt vị trí cursor tọa độ hình thông điệp post 3.4.7 - Cấu trúc SIZE: - Chứa viewport extents, window extents, text extents, bitmap dimensions, aspect-ratio filter cho vài hàm mở rộng - Cú pháp: typedef struct tagSIZE { int cx; int cy; } SIZE; - Thông số: cx cy x-extent hàm trả y-extent hàm trả 3.4.8 - Cấu trúc MOUSEHOOKSTRUCT: - Cấu trúc MOUSEHOOKSTRUCT chứa thông tin kiện chuột - Cú pháp: typedef struct tagMOUSEHOOKSTRUCT { POINT pt; HWND hwnd; UINT wHitTestCode; DWORD dwExtraInfo; } MOUSEHOOKSTRUCT; - Thơng số: pt điểm có cấu trúc POINT chứa tọa độ x,y mouse cursor hệ tọa độ hình hwnd cửa sổ nhận thông điệp chuột tương ứng với kiện mouse wHitTestCode mã hit-test trả dwExtraInfo thông tin thêm vào tổ chức với kiện mouse Một ứng dụng thiết lập thơng tin thêm vào cách gọi hàm kiện phần cứng lấy cách gọi hàm GetMessageExtraInfo Kết hướng phát triển Chương trình GETTEXT bước đầu đáp ứng yêu cầu đề tài đặt ra: Nhận dạng từ hiển thị hình Tuy nhiên, kỹ thuật override thực mơi trường Windows 16 bits, nên chương trình chạy môi trường Windows 16bits Trong môi trường Windows 9x, môi trường lai tạp 16bits 32bits, nên chương trình nhận dạng dòng văn xuất hàm kết xuất văn mơi trường 16bits (như TextOut, ExtTextOut), cịn văn kết xuất hàm môi trường 32bits (như TextOutA, ExtTextOutA - dùng để kết xuất văn phầm mềm 32bits Microsoft Office 97) chương trình khơng thể nhận dạng Dù điều mà đề tài đạt đưa giải thuật khung sườn mang tính khả thi, phát triển hồn chỉnh tương lai Do vậy, để nhận dạng tất từ xuất hình Windows phải override hàm Windows 32bits Việc thực vấn đề lớn, cần phải hiểu sâu sắc Windows, Windows có chế độ bảo vệ nhớ chặt chẽ, nên ghi xố vào hàm API cách mà chương trình làm, cần phải có giải thuật khác Ngoài việc lấy liệu cách override hướng để giải vấn đề, ta thực cách khác dùng hàm lấy text mà Windows có hỗ trợ, vấn đề phức tạp

Ngày đăng: 27/07/2023, 23:25

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w