Ngày nay, hầu như mọi công việc hàng ngày liên quan đến cuộc sống của chúng ta đều diễn ra trê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 toàn cầu Internet đối với người sử dụng là công việc thường ngày và rất phổ biến. Từ đó, sẽ phát sinh vấn đề là người sử dụng sẽ cần tìm hiểu ý nghĩa của một từ, một câu hoặc cần phải dịch một đoạn văn bản, một file dữ liệu nào...
Báo Cáo Luận Văn Tốt Nghiệp Trang 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 IV Cửa sổ Windows 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 - Chuỗi hook - Thủ tục hook - Các loại hook - Sử dụng hook - Hook Windows 3.x - Giới thiệu số hàm liên quan đến hook CHƯƠNG 3: KỸ THUẬT OVERRIDE HÀM API I Khái quát kỹ thuật override II Lý sử dụng kỹ thuật override lập trình Windows III Cơ chế hoạt động quản lý nhớ Windows 16bits IV Cơ chế hoạt động quản lý nhớ Windows 32bits V Hiện thực kỹ thuật override Windows 16bits VI Một số hàm sử dụng kỹ thuật override CHƯƠNG 4: KẾT XUẤT VĂN BẢN TRONG WINDOWS I Kết xuất văn Windows II Các hàm để kết xuất văn CHƯƠNG 5: PHÂN TÍCH VÀ THIẾT KẾ CHƯƠNG TRÌNH I Phân tích vấn đề II Thiết kế chương trình III Giới thiệu số hàm có liên quan IV Giới thiệu số cấu trúc liệu có liên quan KẾT QUẢ VÀ HƯỚNG PHÁT TRIỂN SVTH : Lương Cao Hoài Taâm 11 15 22 26 27 27 28 30 31 33 36 37 37 38 41 45 50 54 55 55 66 67 68 78 92 97 Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang Đề tài : Nghiên cứu phương pháp nhận dạng từ cursor mouse Desktop Windows Viết chương trình nhận dạng từ SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang Lời Mở Đầu gà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 Vì thế, thời gian làm Luận Án Tốt nghiệp hướng dẫn thầy Lê Tấn Hùng nhóm sinh viên chúng tơi thực đề tài: “ Nhận dạng từ cursor mouse deskop Windows Viết chương trình nhận dạng từ ” Trong giai đoạn đầu Luận Án Tốt Nghiệp 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 Luận Án Tốt Nghiệp 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à 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 SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang Chương 1: TÌM HIỂU VỀ LẬP TRÌNH WINDOWS SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang I - KHÁI QUÁT VỀ LẬP TRÌNH TRONG WINDOWS: - Khái qt 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, khơng thể 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 - 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: SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghieäp Trang - 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: - 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 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 vào hệ thống Windows Một cửa sổ gởi thông điệp cho cửa sổ khác SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 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 quát: 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 - 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: 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 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 SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang - 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 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 - 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ặpHardware thơng điệp có dạng sau: Event Occur while GetMessage(&msg,NULL,0,0) System Message Queue { TranslateMessage(&msg); DispatchMessage(&msg); System Dispatcher } Thread1 Message Queue Thread2 Message Queue Sau Sơ đồ dịng thơng điệp: Thread1 Hook Thread2 Hook System Dispatcher Thread3 Message Queue Thread3 Hook GetMessage() TranslateMessage() Dispatch Message() GetMessage() TranslateMessage() Dispatch Message() GetMessage() TranslateMessage() Dispatch Message() WndProc() WndProc() WndProc() DefWndProc() DefWndProc() DefWndProc() SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang Nó mơ tả đơn giản hóa q trình xử lý thơng điệp Thơng điệp bắt nguồn từ nhiều cách khác nhau, sơ đồ sau giải thích chi tiết vịng lặp thơng điệp cách thơng điệp đặt vào hàng đợi nào: Hardware Events Other threads PostMessage() System Message Queue Message Sent From Other Threads Other threads PostMessage() System Dispatcher Thread Message Queue SentMessage() (To Another Thread) PostMessage() TranslateMessage() Message Loop SentMessage() WndProc() Thông điệp không phát xuất từ kiện phần cứng, có thơng điệp chương trình phát xuất từ chương trình chạy Các threads gởi liệu trở sau trước cách gởi thơng điệp Thơng điệp gởi vào hàng đợi hàm PostMessage() , chúng gởi trực tiếp cho vịng lặp thơng điệp để xử lý hàm SendMessage() SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 10 - Xử lý thơng điệp: Việc xử lý thơng điệp yếu tố làm cho ứng dụng Windows vận hành Hệ thống ứng dụng khác sinh thông điệp cho kiện xuất hệ thống thông điệp Windows cho phép Windows chạy đa nhiệm thời điểm Windows 95 Windows NT mở rộng khả version Windows trước việc cấp phát cho dòng xử lý (thread) hay tiến trình (proccess) hàng đợi thơng điệp riêng Trong version Windows cũ tất ứng dụng dùng chung hàng đợi thơng điệp, để ứng dụng khác xử lý thông điệp, ứng dụng phải trả quyền điều khiển cho Windows Với Windows 95 Windows NT, điều khơng cịn Windows sinh thơng điệp cho kiện phần cứng, ví dụ người dùng nhấn phím di chuyển chuột Nó gởi thơng điệp đến hàng đợi thơng điệp thread thích hợp, thơng điệp dành cho nhiều thread đưa vào hàng đợi thread Một thông điệp thực tế cấu trúc liệu sau: typedef struct tagMSG { HWND hwd; UINT message; WPARAM wParam; LPARAM wParam; DWORD time; POINT pt; } // handle cửa sổ //số định loại message //được chuyển cho WndProc() //được chuyển cho WndProc() //số mili giây từ lúc bắt đầu //cấu trúc điểm POINT III - GIAO DIỆN THIẾT BỊ ĐỒ HỌA GDI (GRAPHIC DEVICE INTERFACE): - Khái niệm: Windows hệ điều hành đa nhiệm (multitasking) ứng dụng giao tiếp với user thông qua hay nhiều giao diện Để truy xuất giao diện chương trình ứng dụng phải sử dụng hàm Giao diện chương trình ứng dụng API tập lệnh mà ứng dụng sử dụng để yêu cầu tiến hành dịch vụ cấp thấp thi hành Windows Giao diện thiết bị đồ họa GDI (Graphic Device Interface) phần API có nhiệm vụ trì độc lập Windows thiết bị đồ họa (cho phép Windows làm việc với nhiều thiết bị đồ họa khác nhau) Windows GDI thư SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 72 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 SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 73 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 - 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 yêu cầu tối thiểu Windows 95, Header khai báo winuser.h, sử dụng thư viện user32.lib – 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, POINT Point // handle cửa sổ cha mẹ // cấu trúc tọa độ điểm ); - Thông số: hWndParent Handle cửa sổ cha mẹ SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 74 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 – 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 uFlags cho biết cửa sổ bị bỏ, kết hợp trị sau: giá 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ổ hoạt động SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 75 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 - 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, LPTSTR lpString, int // handle cửa sổ hay điều khiển có chứa text // địa vùng đệm cho text 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 SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 76 - Ghi chú: Nếu cửa sổ đích thuộc sở hữu 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 - 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 SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 77 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 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ổ: SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 78 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_INVALIDATElà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 SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 79 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 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 SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 80 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 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 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ị SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 81 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ổ a) 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 b) 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ổ luôn hình chữ nhật hình dạng frame thay đổi SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 82 IV – 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 - 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 – 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; } – 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 left; LONG top; LONG right; LONG bottom; } RECT; – 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 SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 83 { 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 dành riêng cho sử dụng nội Windows fIncUpdate 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 – 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 thông điệp paramL 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 paramH 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 SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 84 time thời điểm mà thông điệp post – 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 - 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; SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 85 - Thơng số: cx x-extent hàm trả cy y-extent hàm trả - 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 SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp Trang 86 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 khơng thể 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 Ngồ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 SVTH : Lương Cao Hoài Tâm Lớp TH40 ... Luận Văn Tốt Nghiệp Trang Đề tài : Nghiên cứu phương pháp nhận dạng từ cursor mouse Desktop Windows Viết chương trình nhận dạng từ SVTH : Lương Cao Hoài Tâm Lớp TH40 Báo Cáo Luận Văn Tốt Nghiệp... Viết chương trình nhận dạng từ ” Trong giai đoạn đầu Luận Án Tốt Nghiệp 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ở từ điển tra cứu từ theo kiểu cổ điển Vì thế, thời gian làm Luận Án Tốt nghiệp hướng dẫn thầy Lê Tấn Hùng nhóm sinh viên thực đề tài: “ Nhận dạng từ cursor mouse deskop Windows Viết chương trình