PDA

View Full Version : [TUTOR] Có thể bạn viết được chương trình giống Click and See đó !!!



CrazyKing
02-11-2002, 14:06
Bạn đang dùng chương trình Click and See phải không nhỉ ? Bạn có bao giờ nghĩ rằng chúng ta sẽ viết được một chương trình giống như vậy ? Crazyking vừa rồi có làm đồ án môn học liên quan đến vấn đề đó , trong quá trình mò mẫm , Crazyking đã rút ra một chút xíu kinh nghiệm , hy vọng sẽ help các U trong việc viết các ứng dụng can thiệp ở mức tạm gọi là "Thường trú trong Window" (Mặt dù trong Win hổng có khái niệm thường trú đâu !!)
Như vậy yêu cầu đặt ra là ta phải viết một chương trình chạy dưới chế độ nền (background) Nó có thể quản lý các message của các application khác ! Để làm được điều này chúng ta phải làm wen với một từ mới "Hook"
Hook là gì ? Hook là một cơ chế mà nhờ đó một hàm có thể chận các sự kiện (message, mouse actions, keystrokes) trước khi chúng đến ứng dụng . Hàm này có thể thực hiện một số thao tác trên sự kiện , và trong một vài trường hợp có thể định nghĩa hoặc huỷ bỏ sự kiện mà nó bắt được !
Chi tiết về Hook các bạn xem thêm trong MSDN . Một đặc điểm quan trọng cần lưu ý là các hàm này được gọi bởi bản thân HĐH Windows chứ không phải bởi ứng dụng.
Có 02 loại hook mà ta cần phải phân biệt đó là
1. Hook cục bộ : Hàm hook chỉ có tác dụng trên tiến trình gọi nó . (Hook này không thể đáp ứng được bài toán đặt ra của ta)
2. Hook toàn cục : Ảnh hưởng toàn hệ thống , Hàm xử lý hook phải đặt trong một dll(dynamic link library) , và dll này được ánh xạ vào tất cả tiến trình trong hệ thống !
Cài đặt một hook :
HHOOK SetWindowsHookEx(
int idHook, // hook type
HOOKPROC lpfn, // hook procedure
HINSTANCE hMod, // handle to application
instance
DWORD dwThreadId // thread identifier
);

Gỡ bỏ một hook :
BOOL UnhookWindowsHookEx(
HHOOK hhk // handle to hook procedure
);
Rùi đó ! Bạn phải xem thêm trong MSDN thì coi như bạn đã cài đặt được một hook toàn cục ! Hè hè , đến đây , vấn đề còn lại là ta phải làm thế nào để lấy được các text của các control thì coi như ..... gần xong :
Ta có thể dùng các hàm sau để lấy text của các loại control :
HWND ChildWindowFromPoint(POINT point);
- point : Vị trí cần lấy.
- trả về: handle control tại vị trí point.

Lấy text của 1 button :
SendMessage( (HWND) hWnd, // handle của
button
WM_GETTEXT, // tên message
(WPARAM) wParam, // Số ký tự
(LPARAM) lParam // Chứa địa chỉ buffer );
Hàm trả về số ký tự copy -> buffer
Lấy tên lớp các control :
int GetClassName(
HWND hWnd, // handle to window
LPTSTR lpClassName, // class name
int nMaxCount // size of class name buffer );

Ví dụ: xét listbox
Lấy index tại vị trí hiện hành :
index = SendMessage(hWnd,LB_GETCURSEL,0,0);
Lấy text tại vị trí index SendMessage(hWnd,LB_GETTEXT,index,buffer);
Còn rất nhiều các loại control mà ta cần lấy các U có thể xem trong MSDN.
Coi như ta đã lấy được text của các control chuẩn , còn trên trang Web, hay trong Word chẳng hạn , làm sao ta có thể, lấy được một từ , khi ta Ctrl + nút phải chuột (Giống như trong Click and see chẳng) , Theo Crazyking thì , ta giả lập một sự kiện Double Click để select chữ đó , sau đó giả lập phím Ctrl + C , Như vậy dữ liệu của ta đã được copy vào Clipboard , OK rùi chứ gì , bây giờ thì coi như ta chỉ việc tra trong Database là tìm ra nghĩa tiếng Việt của từ đó rùi.
Phù , mệt quá rùi , không biết viết hồi nãy đến giờ , có gì sai hổng nữa , tại vì môn Lập trình C for win tui học kỳ trước trước trước lận , nện bây giờ bị quên nhiều rùi , có gì sai thì các U đừng có cười nghen , Crazyking cũng vì DDTH thui mà , mình cũng muốn cho tất cả chúng ta đều tôt mừ !!! Hè hè , bây giờ phải đi khò một giấc đến chiều cái đã !!!!!!!!
Khò khò !

asterix
03-11-2002, 01:09
Quá hay đấy CrazyKing. Những đoạn code và kiến thức nho nhỏ thế này thôi giúp chúng ta hiểu thêm được nhiều lắm đấy. Một lần nữa cám ơn bạn!

MakeLove
14-11-2002, 09:19
Nếu được thì CRazyking gởi code lên xem chơi ????

loveoflife
14-11-2002, 18:45
Bài của bạn CrazyKing về Hook rất hay, tuy nhiên việc bạn đề xuất cách lấy chữ giống như Click and See (CnS) thì không ổn đâu. Thứ nhất là đâu phải lúc nào cứ click đúp là đánh dấu từ đâu. Thứ hai là đâu phải cứ đánh dấu là copy được. Và thứ ba ... hãy thử tưởng tượng một chút thôi, giả sử một người dùng bật dialog Format Disk lên và thấy nút OK, anh ta không hiểu OK là gì và anh ta dùng từ điển của bạn để tra, anh ta Ctrl+Click lên nút OK đó, vậy là ... Bùm. Hậu quả chắc là thê thảm lắm.
Tuy nhiên nếu dùng CnS thì không bị như vậy đâu. Vậy CnS làm cách nào ??? Tôi cũng không biết chắc nhưng theo tôi được bảo thì CnS (và cả MTD) đều dùng API HOOK (khác với HOOK của bạn đấy nhé). Chúng chặn các API viết text ra màn hình, và khi người dùng Ctrl+Click, chương trình sẽ buộc text đó phải refresh lại và như vậy là ta lấy được text cần lấy. Bạn chú ý là mỗi khi Ctrl+Click thì có 1 vệt nháy xuất hiện ngang chỗ đó -> buộc phải refresh lại. Tôi cũng không chắc cách đó có đúng không nhưng rất có lý đó.

CrazyKing
15-11-2002, 00:54
To : loveoflife Hi ! bác nói đúng lắm , nắm bắt được các hàm outtext ...... để bắt màn hình vẽ lại thì có thể bắt được các từ !!! Nhưng dù sao thì cũng phải đặt một hook như trên thui !!! Còn nhấn để bắt nút OK của bác nói trên thì đâu có vấn đề gì ??? Chúng ta đã định nghĩa lại phương thức đó rùi mà !!!