Nghiên cứu phương pháp nhận dạng chữ dưới con trỏ chuột trên Desktop Windows và ứng dụng trong chương trình nhận dạng

MỤC LỤC

FW_DONTCARE 0

BYTE tmItalic Khác 0 nếu chữ nghiêng BYTE tmUnderlined Khác 0 nếu chữ có gạch dưới BYTE tmStruckOut Khác 0 nếu chữ bị gạch giữa thân BYTE tmFirstChar Ký tự đầu tiên của font. BYTE tmLastChar Ký tự cuối cùng của font BYTE tmDefaultChar Ký tự mặc định để thay thế. TMPF_FIXED_PITCH TMPF_VECTOR TMPF_TRUETYPE TMPF_DEVICE FF_DECORATIVE FF_DONTCARE FF_MODERN FF_ROMAN FF_SCRIPT FF_SWISS.

DEFAULT_CHARSET 1

* Khung chữ nhật bao dòng text (bounded-rectangle): Là khung chữ nhật nhỏ nhất bao trọn hình ảnh dòng text bên trong, nó có các cạnh tiếp xúc với các điểm ảnh xa nhất ở 4 hướng (trên, dưới, trái, phải). - Thuộc tính canh văn bản (Text Alignment): cho phép ta thay đổi mối tương quan giữa điểm xuất phát tọa độ thường được chuyển cho hàm kết xuất văn bản (như các hàm TextOut() và ExtTextOut()) và đoạn văn bản phải kết xuất. GDI cho phép đặt các cờ hiệu canh văn bản bằng hàm SetTextAlign() và hàm GetTextAlign() để đi tìm trị của các cờ hiệu canh văn bản.

* CP - current position: Mỗi DC định nghĩa một CP để dùng trong các trường hợp tọa độ khụng chỉ định rừ hoặc vẽ cỏc đối tượng liờn tiếp nhau. Trong khi đó một số hàm để lấy các đặc tính DC của các dòng văn bản được xuất đó lại được tính bằng nhiều đơn vị khác nhau, lúc thì tính bằng đơn vị logic, lúc thì lại được tính bằng các loại tọa độ thiết bị khác nhau. Ngoài ra, đơn vị tính của vị trí cursor mouse lại được tính bằng hệ toạ độ thiết bị toàn màn hình nên trong quá trình tính toán chúng ta cần lưu ý để chuyển tất cả chúng về cùng một hệ tọa độ để phần tính toán được chính xác.

- Giá trị trả về: Trả về giá trị trong đó word thấp chứa tọa độ x, word cao chứa tọa độ y của origin dịch cuối cùng trong tọa độ thiết bị. Chú ý rằng một điểm được coi là thuộc hình chữ nhật khi nó nằm ở trên cạnh trái, nằm ở trên cạnh trên hoặc nằm hoàn toàn trong hình chữ nhật, ngược lại một điểm không thuộc hình chữ nhật khi nó nằm ở bên ngoài, nằm ở trên cạnh phải hoặc nằm ở trên cạnh dưới của hình chữ nhật. Có nghĩa là tại một vị trí bất kỳ nào đó của cursor mouse trên màn hình Windows nếu có một tác động chuột quy định trước (chẳng hạn như click nút phải của chuột) thì phải lấy được từ ở ngay dưới vị trí cursor (nếu có), hoặc xuất ra thông báo cho biết không có từ nào nằm ngay dưới vị trí cursor đang đứng.

* Thể hiện dưới dạng chuỗi văn bản, dùng hàm kết xuất văn bản - Đối với dạng thể hiện ảnh, văn bản chỉ là tập các điểm ảnh của bức ảnh, chẳng có ý nghĩa gì khác đối với Windows, nên nếu muốn trích văn bản ra chỉ có một cách là xử lý ảnh, điều này thực sự là một vấn đề hay và có nhiều ứng dụng thực tiễn: như nhận dạng một trang giấy được scan vào máy để tạo ra file text tương ứng thay cho việc đánh máy lại trang giấy đó. Tuy nhiên nó là vấn đề hết sức phức tạp có sai số nhất định, và tùy thuộc vào font chữ mà văn bản thể hiện, trong khi đú cú một cỏch khỏc để lấy đượùc chớnh xỏc cỏc dũng text trờn màn hình. - Đối với dạng thể hiện văn bản bằng các hàm kết xuất văn bản: Ứng dụng sẽ gởi cho Windows chuỗi văn bản cần thể hiện và các thông số cần thiết, và Windows dùng các hàm kết xuất văn bản để vẽ chuỗi văn bản đó ra màn hình.

Từ cách kết xuất đó đã nảy sinh một ý tưởng về việc nhận dạng các dòng text trên màn hình: là nếu ta có thể khống chế các hàm kết xuất văn bản, lấy về các thông tin của các hàm này, thì vấn đề có thể thực hiện được mà không cần phải xử lý ảnh. * Từ sự phân tích đó chúng tôi đã chọn giải thuật dựa vào sự khống chế các hàm xuất văn bản của Windows, và cũng may mắn là hầu như tất cả dòng văn bản kết xuất ra màn hình đều dùng dạng kết xuất dùng hàm kết xuất văn bản, nên nếu thực hiện hoàn hảo ý tưởng nói trên thì vấn đề được giải quyết gần như hoàn toàn. Chú ý là trong phần xử lý này phải có cách nào đó để khiến Windows vẽ lại các dòng text, có như vậy thì hàm override kết xuất văn bản mới vớt được các thông tin, và in kết quả vào cửa sổ ứng dụng của chương trình chính.

WM_QUIT)

Vòng loop bắt thông điệp: Dẫn vào hàm xử lý thoõng ủieọp cuỷa chửụng trỡnh: MenuWndProc.

KEÁT THUÙC

-Lấy bộ chọn phân đọan và địa chỉ offset hàm override -Đổi từ code selector của hàm API sang data selector Hàm PrestoChangoSelector(). -Ghi lên 5 byte đầu của hàm API bằng đoạn code assembler -Đổi trở lại từ data selector sang code selector.

LƯU ĐỒ HÀM XỬ LÝ MOUSEHOOK (GTDLL - MouseFunc)

Hàm cập nhật vùng client của cửa sổ bằng cách gởi một thông điệp WM_PAINT trực tiếp tới cửa sổ nếu vùng cập nhật cho cửa sổ là không trống. Hook hệ thống nên được xử lý cho những ứng dụng có mục đích đặc biệt hay để sử dụng như là một trợ giúp (aid) đặc biệt trong khi debug ứng dụng. - Giá trị trả về: Là handle của cửa sổ con chứa điểm contains the point ngay cả trong trường hợp cửa sổ con bị che hay không thể hoạt động hidden or disabled.

HWND ChildWindowFromPointEx(. HWND hwndParent, // handle của cửa sổ cha mẹ POINT pt, // cấu trúc tọa độ điểm UINT uFlags // những cờ bỏ quãng );. Nếu điểm ở trong cửa sổ cha mẹ nhưng không ở trong bất kỳ cửa sổ con nào bắt gặp tiêu chuẩn thì giá trị trả về là handle của cửa sổ cha mẹ. - Ghi chú: Nếu cửa sổ đích thuộc sở hữu bởi quá trình hiện 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 đặc tả.

- Nếu nCode nhỏ hơn 0 thì 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 và nên trả về giá trị được trả về bởi CallNextHookEx. - Giá trị trả về: Nếu nCode < 0 thì trả về giá trị do CallNextHookEx trả về còn nếu nCode >= 0 và thủ tục hook không xử lý thông điệp nó đề nghị bạn gọi CallNextHookEx và trả về giá trị nó trả về ngược lại những ừng dụng khác đã đặt hook WM_MOUSE sẽ không nhận thông báo hook và có thể đối xử chính xác như là một kết quả. Nếu thủ tục hook đã xử lý thông điệp thì nó trả về một giá trị khác 0 để 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 bằng cách đặc tả kiểu hook WH_MOUSE và địa chỉ của thủ tục hook trong một gọi tới hàm SetWindowsHookEx. RDW_ERASENOW làm cho các cửa sổ bị tác dụng (như là được xác định bởi cờ RDW_ALLCHILDREN và. RDW_NOCHILDREN) nhận thông điệp. RDW_UPDATENOW làm cho các cửa sổ bị tác dụng (như là được xác định bởi cờ RDW_ALLCHILDREN và RDW_NOCHILDREN) nhận thông điệp WM_NCPAINT, WM_ERASEBKGND và WM_PAINT.

- Chú ý: Khi hàm RedrawWindow được dùng để làm mất hiệu lực vùng cửa sổ desktop thì cửa sổ desktop không nhận thông điệp WM_PAINT. Origin này xác định offset được sử dụng bởi Windows để dịch tọa độ thiết bị sang tọa độ client cho các điểm trong một cửa sổ ứng dụng. Các thông điệp này được gởi đến cửa sổ được cho bằng hàm SendMessage và khiến cho ứng dụng quản lý cửa sổ đó vẽ lại cửa sổ.

Mặt bằng cửa sổ bị thay đổi liên tục (bởi các lệnh resize, đóng mở các dialog box…) vì thế nếu không cập nhật thì sẽ bị biến dạng nên Windows dùng thông điệp WM_PAINT để tô vẽ lại màn hình. - Chứa thông tin từ hàng ứng dụng của Windows, được sử dụng để lưu trữ thông tin thông điệp cho hàm callback JornalPlaybackProc.