0
Tải bản đầy đủ (.doc) (98 trang)

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 79 -93 )

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ì toà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ố:

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

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ì toà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ố:

Idhook kiểu thủ tục hook được đặt, gồm các giá trị sau:

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 toá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_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 kiểm tra.

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

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ì toà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

WM_NCPAINT. Cờ RDW_INVALIDATE cũng 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ì toà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 79 -93 )

×