Giới thiệu một số hàm cĩ liên quan:

Một phần của tài liệu Nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên Desktop Windows (Trang 69 - 81)

1) Hàm InvalidateRect:

Hàm InvalidateRect cộng một hình chữ nhật vào một vùng cập nhật của cửa sổ. Vùng cập nhật đại diện cho vùng client của cửa sổ phải được vẽ lại.

- Cú pháp:

void InvalidateRect(hwnd, lprc, fErase)

HWND hwnd;

const RECT FAR* lprc;

BOOL fErase;

-Thơng số:

hwnd cửa sổ mà vùng cập nhật của nĩ thay đổi

lprc chỉ tới địa chỉ cấu trúc RECT chứa tọa độ client của hình chữ nhật được cộng thêm vào vùng cập nhật. Nếu NULL thì tồn bộ vùng client được cộng vào vùng cập nhật

fErase xác định cĩ hay khơng cĩ background ở trong vùng cập nhật bị xĩa khi vùng cập nhật được xử lý. Nếu TRUE thì background bị xĩa khi BeginPaint được gọi, nếu NULL thì background vẫn khơng thay đổi.

- Giá trị trả về: hàm khơng trả về giá trị nào cả.

2) Hàm InvalidateRgn:

Hàm InvalidateRgn cộng một vùng vào vùng cập nhật của cửa sổ. Vùng cập nhật đại diện cho vùng client của cửa sổ phải được vẽ lại.

- Cú pháp:

void InvalidateRgn(hwnd, hrgn, fErase) HWND hwnd;

HRGN hrgn; BOOL fErase;

- Thơng số:

hrgn vùng được cộng vào vùng cập nhật. Vùng phải cĩ tọa độ client. Nếu NULL thì tồn vùng client được cộng vào vùng cập nhật.

fErase xác định cof1 hay khơng background bị xĩa khi vùng cập nhật được xử lý. Nếu TRUE thì background bị xĩa khi BeginPaint được gọi. Nếu FALSE thì background vẫn khơng đổi.

- Giá trị trả về: hàm khơng trả về giá trị gì.

3) Hàm UpdateWindow:

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. Hàm gởi thơng điệp WM_PAINT trực tiếp tới thủ tục cửa sổ của cửa sổ bỏ qua hàng ứng dụng. Nếu vùng cập nhật trống thì khơng cĩ thơng điệp nào được 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ả về giá trị

4 – Hàm đặt hook SetWindowsHookEx:

- Hàm SetWindowsHookEx cài đặt một thủ tục hook định nghĩa ứng dụng vào một chuỗi hook. Cài đặt thủ tục hook để quản lý hệ thống cho kiểu sự kiện nào đĩ. Những sự kiện này được tổ chức với cả thread đặc biệt hay với cả tất cả thread trong hệ thống.

- Cú pháp:

HHOOK SetWindowsHookEx(

Int idHook, // kiểu hook để cài đặt HOOKPROC lpfn, // địa chỉ của thủ tục hook

HINSTANCE hMod, // handle chỉ tới thể hiện của ứng dụng DWORD dwThreadId // nhận dạng của thread để đặt hook );

- Các thơng số:

WH_CALLWNDPROC đặt một thủ tục hook quản lý các thơng điệp trước lúc hệ thống gởi chúng tới cửa sổ đích.

WH_CALLWNDPROCRET đặt một thủ tục hook quản lý các thơng điệp sau khi chúng được xử lý bởi thủ tục cửa sổ đích.

WH_CBT đặt một thủ tục hook nhận những thơng báo cĩ ích tới ứng dụng huấn luyện trên cơ sở tính tốn (CBT).

WH_DEBUG đặt một thủ tục hook cĩ ích cho việc debug những thủ tục hook khác.

WH_FOREGROUNDIDLE đặt một thủ tục hook sẽ được gọi khi thread foreground của ứng dụng sẽ trở thành khơng dùng đến. Hook này cĩ ích cho hoạt động những nhiệm vụ (task) độ ưu tiên thấp trong thời gian khơng được dùng đến.

WH_GETMESSAGE đặt một thủ tục hook quản lý các thơng điệp được post tới hàng thơng điệp.

WH_JOURNALPLAYBACK đặt một thủ tục hook post những thơng điệp được ghi trước đĩ bởi thủ tục hook WH_JOURNALRECORD.

WH_JOURNALRECORD đặt một thủ tục hook ghi những thơng điệp đầu vào được post tới hàng thơng điệp hệ thống. Hook này cĩ ích cho việc ghi các macro.

WH_KEYBOARD đặt một thủ tục hook quản lý các thơng điệp keystroke. WH_KEYBOARD_LL Windows NT: đặt một thủ tục hook quản lý những sự kiện nhập vào từ keyboard mức thấp.

WH_MOUSE đặt một thủ tục hook quản lý các thơng điệp chuột.

WH_MOUSE_LL Windows NT: đặt một thủ tục hook quản lý những sự kiện đầu vào chuột mức thấp.

WH_MSGFILTER đặt một thủ tục hook quản lý các thơng điệp được kết sinh như là một kết quả cuả sự kiện đầu vào ở trong dialog box, message box, menu hay scroll bar.

WH_SHELL đặt một thủ tục hook quản lý các thơng điệp nhận thơng báo hữu ích để shell các ứng dụng.

WH_SYSMSGFILTER đặt một ứng dụng các thơng điệp được kết sinh như là kết quả của một sự kiện đầu vào ở trong dialog box, message box, menu hay scroll bar. Thủ tục hook quản lý những thơng điệp này cho tất cả các ứng dụng trong hệ thống.

lpfn trỏ tới thủ tục hook. Nếu dwThreadId bằng 0 hay đặc tả danh hiệu một thread được tạo ra bởi một quá trình khác, lpfn phải chỉ tới một thủ tục hook trong

một DLL. Cịn khơng, lpfn cĩ thể trỏ tới một thủ tục hook trong code đươc tổ chức với quá trình hiện thời.

hMode handle chỉ tới DLL chứa thủ tục hook được trỏ tới bởi lpfn. hMode phải được đặt NULL nếu dwThread đặc tả một thread được tạo bởi quá trình hiện hành và nếu thủ tục hook ở trong code được tổ chức với quá trình hiện hành.

dwThreadId đặc tả danh hiệu của thread với thủ tục hook đã được tổ chức, nếu là 0 thì thủ tục hook được tổ chức với tất cả các thread đang tồn tại.

Giá trị trả về: là handle chỉ tới thủ tục hook nếu thành cơng và NULL nếu thất bại.

- Ghi chú: lỗi cĩ thể xảy ra nếu thơng số hMode là NULL và dwThreadId = 0 hay đặc tả danh hiệu của một thread được tạo ra bởi một quá trình khác.

Tầm vực của hook phụ thuộc vào kiểu hook. Một vài hook cĩ thể được đặt chỉ với tầm vực hệ thống, những hook khác cũng được đặt chỉ cho một thread đặc biệt, đây là 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 chỉ system

WH_JOURNALRECORD chỉ 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 chỉ system

Với một loại hook đã đặc tả thì hook thread được gọi trước rồi mới đến hook hệ thống. Hook hệ thống là những tài nguyên được chia sẻ và khi đặt một cái sẽ ảnh hưởng lên tất cả các ứng dụng. Tất cả các hàm hook hệ thống phải ở trong các thư

viện. 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. Các thư viện khơng cần hook thì nên gở bỏ thủ tục hook.

5 - Hàm WindowFromPoint:

- Hàm này lấy handle của cửa sổ chứa điểm đã được xác định. - Cú pháp:

HWND WindowFromPoint (

POINT Point // cấu trúc điểm );

- Thơng số:

Point : điểm được kiểm tra

- Giá trị trả về: Là một handle của cửa sổ chứa điểm. Nếu khơng cĩ cửa sổ nào chứa điểm đĩ thì giá trị trả về là NULL. Nếu điểm nằm trong điều khiển text tĩnh (static text control) thì giá trị trả về là handle của cửa sổ nằm bên dưới điều khiển text tĩnh.

- Ghi chú: Hàm WindowFromPoint khơng lấy một handle của một cửa sổ bị che hay khơng hoạt dộng được, ngay cả nếu điểm ở trong cửa sổ. Một ứng dụng sẽ sử dụng hàm ChildWindowFromPoint cho việc tìm kiếm khơng cĩ giới hạn. Hàm này yêu cầu tối thiểu là Windows 95, Header được khai báo trong winuser.h, sử dụng thư viện user32.lib

6 – Hàm ChildWindowFromPoint:

- Hàm ChildWindowFromPoint xác định rõ những cửa sổ con nào thuộc về một cửa sổ cha mẹ chứa điểm đã cho.

- Cú pháp:

HWND ChildWindowFromPoint (

HWND hWndParent, // handle của cửa sổ cha mẹ POINT Point // cấu trúc tọa độ điểm

); - Thơng số:

hWndParent Handle của cửa sổ cha mẹ.

Point Cấu trúc POINT định nghĩa tọa độ client của điểm được

- 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. Nếu điểm nằm ngồi cửa sổ cha mẹ thì giá trị trả về là NULL. Nếu điểm ở trong cửa sổ cha mẹ nhưng khơng ở trong bất kỳ cửa sổ con nào thì trả về handle của cửa sổ cha mẹ.

- Ghi chú: Hệ thống duy trì danh sách nội, chứa handle các cửa sổ con được tổ chức bằng một cửa sổ cha mẹ. Thứ tư các handle trong danh sách phụ thuộc vào trật tự Z của những cửa sổ con. Nếu cĩ nhiều hơn một cửa sổ con chứa điểm thì hệ thống trả về handle của cửa sổ đầu tiên trong danh sách mà cĩ chứa điểm. Hàm này địi hỏi tối thiểu Windows 95, Header: được khai báo trong winuser.h, sử dụng Import Library user32.lib.

7 – Hàm ChildWindowFromPointEx:

- Hàm ChildWindowFromPointEx xác định rõ những cửa sổ con thuộc về cửa sổ cha mẹ chứa điểm. Hàm cĩ thể phớt lờ cửa sổ con khơng nhìn thấy, khơng thể hoạt động được và trong suốt.

- Cú pháp:

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 );

- Thơng số:

hwndParent Handle của cửa sổ cha mẹ.

pt cấu trúc POINT định nghĩa tọa độ client của điểm được kiểm tra.

uFlags cho biết những cửa sổ con bị bỏ, cĩ thể kết hợp các giá trị sau:

Giá trị Ý nghĩa

CWP_ALL Khơng bỏ bất kỳ cửa sổ con nào

CWP_SKIPINVISIBLE Bỏ những cửa sổ con khơng nhìn thấy CWP_SKIPDISABLED Bỏ những cửa sổ con khơng thể hoạt động CWP_SKIPTRANSPARENT Bỏ những cửa sổ con trong suốt

- Giá trị trả về: Là handle của cửa sổ con đầu tiên chứa điểm và bắt gặp tiêu chuẩn (critia) được đặc tả bởi uFlags. 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ẹ. Nếu điểm nằm ngồi cửa sổ cha mẹ hay nếu hàm thất bại thì giá trị trả về là NULL.

- Ghi chú: Hệ thống duy trì một danh sách nội chứa handle của những cửa sổ con được tổ chức bằng cửa sổ cha mẹ. Thứ tự của các handle trong danh sách phụ thuộc vào trật tự Z của những cửa sổ con. Nếu cĩ nhiều hơn một cửa sổ con chứa điểm thì hệ thống trả về handle của cửa sổ đầu tiên trong danh sách chứa điểm và bắt gặp tiêu chuẩn trong uFlags. Hàm này địi hỏi tối thiểu Windows 95, Header: được khai báo trong winuser.h, sử dụng Import Library user32.lib.

8 - Hàm GetWindowText:

- Hàm GetWindowText sao chép text thanh tiêu đề của cửa sổ đã được đặc tả (nếu nĩ cĩ một) vào một vùng đệm. Nếu cửa sổ được đặc tả là một điều khiển thì text của điều khiển được sao chép. Tuy nhiên, GetWindowText khơng thể lấy text của điều khiển trong một ứng dụng khác.

- Cú pháp:

int GetWindowText(

HWND hWnd, // handle của cửa sổ hay điều khiển cĩ chứa text LPTSTR lpString, // địa chỉ của vùng đệm cho text

int nMaxCount // số cực đại những ký tự để sao chép );

- Thơng số:

hWnd Handle của cửa sổ hay điều khiển cĩ chứa text.

lpString Pointer chỉ tới vùng đệm sẽ nhận text.

nMaxCount số lượng cực đại các ký tự chép tới vùng đệm tính luơn cả ký tự, NULL. Nếu đoạn text vượt quá giới hạn này thì nĩ sẽ bị cắt bớt.

- Giá trị trả về: Nếu thành cơng thì trả về độ dài các ký tự trong chuỗi được chép khơng tính ký tự rỗng cuối chuỗi. Nếu cửa sổ khơng cĩ thanh tiêu đề hay đoạn text, hay nếu thanh tiêu đề rỗng hay nếu handle của cửa sổ hoặc thanh tiêu đề khơng hợp lệ thì giá trị trả về là zero. Hàm này khơng thể lấy đoạn text của một edit control trong ứng dụng khác.

- 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 cửa sổ đích được sở hữu bởi một quá trình khác và cĩ một đầu đề (caption) thì hàm GetWindowText lấy phần text caption của cửa sổ. Nếu cửa sổ khơng cĩ caption thì giá trị trả về là một chuỗi rỗng. Hàm này địi hỏi tối thiểu

Windows 95, Header: được khai báo trong winuser.h, sử dụng Import Library user32.lib.

9 - Hàm MouseProc:

Thủ tục hook MouseProc là một 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 này bất cứ khi nào một ứng dụng gọi hàm GetMessage hay PeekMessage và cĩ một thơng điệp chuột được xử lý.

Kiểu HOOKPROC định nghĩa một pointer trỏ tới hàm callback. MouseProc là một 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 một code thủ tục hook sử dụng để quyết định làm thế nào để xử lý thơng điệp, cĩ thể cĩ giá trị:

Giá trị Ý nghĩa

HC_ACTION wParam và lParam chứa thơng tin một thơng điệp chuột

HC_NOREMOVE wParam và lParam chứa thơng tin một thơng

điệp chuột, và thơng điệp chuột khơng bị xĩa khỏi hàng message.

- 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.

wParam chứa danh hiệu của thơng điệp chuột

lParam là pointer trỏ tới cấu trúc MOUSEHOOKSTRUCT

- 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. 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 ra vào trong vùng client của 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 được vẽ lại. Nếu NULL thì cửa sổ desktop được cập nhật.

lprcUpdate chỉ tới cấu trúc RECT chứa tọa độ của hình chữ nhật cập nhật. Thơng số này bị phớt lờ nếu hrgnUpdate chứa handle vùng hợp lệ.

hrgnUpdate vùng cập nhật. Nếu cả hrgnUpdate và lprcUpdate đều NULL thì tồn bộ vùng client của cửa sổ được cập nhật.

fuRedraw một hay nhiều cờ vẽ lại, cĩ thể kết hợp nhiều cờ.  Các cờ sau được sử dụng để làm mất 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 khi cửa sổ được vẽ lại. Cờ RDW_INVALIDATE cũng phải được xác định nếu khơng cờ RDW_ERASE khơng cĩ tác dụng.

RDW_FRAME làm cho bất kỳ vùng nào của vùng non-client của cửa sổ mà giao với vùng cập nhật nhận thơng điệp

phải được xác định nếu khơng RDW_FRAME khơng ảnh hưởng. Thơng điệp thường khơng gởi trong suốt sự thực thi của hàm RedrawWindow trừ khi

RDW_UPDATENOW hay RDW_ERASENOW được xác định.

RDW_INTERNALPAINT làm cho WM_PAINT được 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 mất hiệu lực lprcUpdate hay hrgnUpdate (chỉ một trong chúng cĩ lẽ khơng NULL). Nếu cả hai NULL, thì tồn bộ cửa sổ bị mất hiệu lực.

 Những cờ sau làm cĩ hiệu lực vùng cửa sổ:

RDW_NOERASE chặn bất kỳ thơng điệp WM_ERASEBKGND nào sắp xảy ra.

RDW_NOFRAME chặn bất kỳ thơng điệp WM_NCPAINT nào sắp xảy ra. Cờ này phải được sử dụng với

Một phần của tài liệu Nghiên cứu các phương pháp nhận dạng từ dưới cursor mouse trên Desktop Windows (Trang 69 - 81)

Tải bản đầy đủ (DOC)

(86 trang)
w