banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK  XML
  [Programming]   GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 01/07/2006 07:18:50 (+0700) | #1 | 2708
lawlesscoder
Member

[Minus]    0    [Plus]
Joined: 29/06/2006 19:01:59
Messages: 25
Offline
[Profile] [PM]
Có bao giờ các bạn đặt ra câu hỏi là tại sao chúng ta có thể gõ tiếng Việt được trong Microsoft Word và các phần mềm soạn thảo văn bản khác hay không? Rõ ràng là chúng ta không thể can thiệp vào mã của Microsoft Word để sửa thành tiếng Việt khi chúng ta muốn soạn thảo văn bản tiếng Việt. Vậy thì tại sao các phần mềm như VietKey, VNI-TanKy lại có thể làm được điều này? Câu trả lời là sử dụng các Hook. Trong bài viết này, chúng ta sẽ cùng tìm hiểu xem Hook là gì mà có thể làm được điều thần kỳ như vậy!


Truớc khi chúng ta tìm hiểu về Hook , chúng ta nhắc lại một chút về quá trình xử lý thông điệp của hệ điều hành Windows


Quá trình xử lý thông điệp của Windows diễn ra như sau : Đầu tiên từ các hành động của nguời dùng như là : click chuột, nhấn phím, .. thì hệ điều hành sẽ chuyển các hành động tương ứng thành các thông điệp (message). Rồi sau đó Windows đẩy các message này vào hàng đợi của hệ thống (system queue) và từ system queue các message đuợc chuyển cho các hàng đợi của ứng dụng (application queue). Từ lúc này các ứng dụng sẽ lấy các message này trong hàng đợi ứng dụng của mình để xử lý (thông qua các vòng lặp chờ thông điệp - message loop).

1. Hook là gì ?

Hook là 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 được gửi đến hàng đợi của ứng dụng. Các 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 lại hoặc hủy bỏ sự kiện mà nó chặn được. Một điểm quan trọng cần lưu ý là các hàm này được gọi bởi chính Windows chứ không phải bởi ứng dụng của chúng ta.

Windows hỗ trợ nhiều loại hook khác nhau, mỗi loại nhắm đến việc chặn bắt một loại thông điệp cụ thể nào đó. Ví dụ, một ứng dụng có thể sử dụng WH_KEYBOARD để giám sát sự di chuyển của thông điệp bàn phím trong hệ thống. Nhờ loại hook này mà một chương trình có thể can thiệp vào và tạo ra khả năng gõ tiếng Việt khi soạn thảo văn bản. Một loại hook khác là WH_MOUSE cho phép theo dõi các thông điệp liên quan đến hoạt động của con chuột.



Hình trên mô tả quá trình xử lý thông điệp của Windows khi có sử dụng các Hook .Thì như trên hình vẽ chúng ta có thể thấy rõ ràng rằng ,một khi chúng ta sử dụng các Hook thì các Hook này sẽ được đặt nằm giữa System Queue và Application Queue .

2. Cơ chế hoạt động của Hook

Hệ thống duy trì một chuỗi hook (hook chain) cho mỗi loại hook. Mỗi chuỗi này là một danh sách liên kết các con trỏ đặt biệt, con trỏ này chính là các hàm callback của ứng dụng có sẵn, nó còn được gọi là hàm hook (hàm lọc, filter function)

Khi có một thông điệp được sinh ra thuộc một loại hook nào đó, nó sẽ được hệ thống đẩy đi vào hàm hook đầu tiên trong chuỗi, lần lượt từng hàm một (qua tất cả các hook trong chuỗi). Công việc của hàm hook có thể phức tạp hay đơn giản tùy thuộc vào từng loại hook. Hàm hook cho một số loại chỉ có thể giám sát, số khác có thể sửa đổi thông điệp hoặc dừng lại việc xử lý thông điệp trên chuỗi hook trước khi chúng đến các hook tiếp theo hoặc đến cửa sổ đích.

3. Ứng dụng của Hook

- Cho phép tạo ra các chương trình hỗ trợ gõ tiếng Việt như : Vietkey

- Cho phép tạo ra các chuơng trình Test tự động phần mềm (bằng cách phát sinh các sự kiện phím, chuột giống như người dùng đang nhập vào).

- Cho phép thay đổi giao diện các ứng dụng đang chạy.

- Cho phép xem phần trợ giúp của các ứng dụng bằng việc nhấn một phím nào đó, ví dụ như nhấn F1 chẳng hạn

- Và nhiều ứng dụng khác nữa tùy vào trí tưởng tượng của các bạn !…

4 . Cài đặt Hook

Giao diện lập trình ứng dụng (API) của Windows cung cấp 3 hàm để thao tác với hook :

• SetWindowsHookEx

• UnhookWindowsHookEx

• CallNextHookEx

a) Cài đặt một Filter Function vào chuỗi các Filter Function của một hook
Tác vụ này được thực hiện thông qua hàm SetWindowsHookEx, khai báo của hàm này như sau :

HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn,
HINSTANCE hMod, DWORD dwThreadId);

Ý nghĩa của từng tham số :

idHook: Xác định loại hook mà ta muốn cài đặt, tham số này có thể là một trong 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 đợi 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_MOUSE : đặt một thủ tục hook quản lý các thông điệp chuột.

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

Mỗi giá trị trên xác định một loại hook mà ta muốn cài đặt, mỗi loại hook có một ý nghĩa và tình huống sử dụng khác nhau.

lpfn : Địa chỉ của Filter Function mà ta muốn gắn với hook.

hMod : Handle của module chứa Filter Function. Nếu ta cài đặt một hook cục bộ (nghĩa là sự thực thi của Filter Function chỉ ảnh hưởng đối với tiến trình cài đặt hook), tham số này phải là NULL. Còn nếu chúng ta muốn có một hook với phạm vi toàn hệ thống (tức là mọi tiến trình đang hiện hữu đều chịu ảnh hưởng bởi Filter Function của chúng ta), tham số này sẽ là Handle của DLL chứa Filter Function.

dwThreadID : Định danh của thread ứng với hook đang được cài đặt . Nếu tham số này là một số khác 0, Filter Function được gắn với hook chỉ được gọi trong ngữ cảnh của một thread xác định. Còn nếu dwThreadID = 0, Filter Function sẽ có phạm vi toàn hệ thống, và dĩ nhiên, nó sẽ được gọi trong ngữ cảnh của bất kỳ thread nào đang tồn tại trên HĐH. Có thể sử dụng hàm GetCurrentThreadId để lấy được handle của thread muốn cài đặt hook.

Một hook có thể được sử dụng ở mức hệ thống, ở mức cục bộ, hoặc ở cả hai mức vừa nêu. Bảng sau mô tả các loại hook cùng tầm ảnh hưởng của nó :

WH_CALLWNDPROC
Thread , Global

WH_CALLWNDPROCRET
Thread , Global

WH_CBT
Thread , Global

WH_DEBUG
Thread , Global

WH_FOREGROUNDIDLE
Thread , Global

WH_GETMESSAGE
Thread , Global

WH_JOURNALPLAYBACK
Global

WH_JOURNALRECORD
Global

WH_KEYBOARD
Thread , Global

WH_MOUSE
Thread , Global

WH_MSGFILTER
Thread , Global

WH_SYSMSGFILTER
Global


Với một loại hook xác định, hook cục bộ sẽ được gọi trước, sau đó là hook toàn cục.

b) Gỡ bỏ một Filter Function ra khỏi chuỗi các Filter Function của một hook

Windows cung cấp hàm UnhookWindowsHookEx giúp chúng ta thực hiện việc này. Khai báo của nó như sau :

BOOL UnhookWindowsHookEx( HHOOK hhk);

Tham số : hhook chỉ ra hàm hook được dỡ bỏ . Đây là giá trị được trả vể bởi hàm SetWindowsHookEx khi hàm Hook được cài đặt.

Chú ý : Hàm UnhookWindowsHookEx phải được sử dụng trong sự kết hợp với hàm SetWindowsHookEx.

c) Chi tiết về Filter Function

Filter Function là một hàm được gắn với loại hook mà chúng ta muốn cài đặt. Hàm này được gọi bởi hệ điều hành Windows chứ không được gọi bởi ứng dụng, đây cũng là lý do mà người ta thường gọi nó là “Callback Function”. Tuy nhiên , để thống nhất về mặt thuật ngữ, từ nay về sau chúng ta vẫn gọi nó là Filter Function.

Tất cả các Filter Function đều có dạng sau :

LRESULT CALLBACK FilterFunc(int nCode, WPARAM wParam, LPARAM lParam);

Ở đây “FilterFunc” chỉ là tên hàm tượng trưng, khi cài đặt, Filter Function sẽ có tên bất kỳ theo ý của người lập trình .

Ý nghĩa của từng tham số truyền cho hàm :

nCode : tham số này thường được gọi là “hook code”, Filter Function sử dụng giá trị này để quyết định cách thức xử lý đối với sự kiện. Giá trị của hook code tùy thuộc vào từng loại hook cụ thể, và mỗi loại hook sẽ có tập hợp những giá trị hook code đặc trưng của riêng mình. Có một quy luật mà dường như các Filter Function của mọi loại hook cần tuân thủ : Khi Windows truyền cho hàm giá trị hook code âm, Filter Function không được xử lý sự kiện mà phải gọi hàm CallNextHookEx với chính những tham số mà hệ điều hành truyền cho nó. Sau đó, nó phải trả về giá trị được trả về bởi hàm CallNextHookEx.

wParam, lParam: Đây là những thông tin cần thiết cho Filter Function trong quá trình xử lý sự kiện. Các giá trị này sẽ có ý nghĩa khác nhau tuỳ thuộc vào từng loại hook. Ví dụ , Filter Function gắn với hook WH_KEYBOARD sẽ nhận mã phím ảo (Virtual-Key Code) từ wParam, đồng thời có được từ lParam thông tin mô tả trạng thái của bàn phím khi sự kiện gõ phím xảy ra.

d) Gọi Filter Function kế tiếp trong chuỗi các Filter Function

Khi một hook được cài đặt, Windows gọi hàm đầu tiên trong chuỗi các Filter Function, và kể từ thời điểm này, trách nhiệm Windows không còn nữa. Filter Function hiện hành phải đảm bảo với hệ thống là có được lời gọi đến hàm kế tiếp trong chuỗi các Filter Function. Bởi lẽ, có thể có một ứng dụng khác cũng cài đặt cùng loại hook để thi hành một số tác vụ nào đó, và nếu như ta không cho Filter Function của ứng dụng này tham gia xử lý sự kiện, sẽ có vấn đề rắc rối xảy ra. Vấn đề sẽ càng trở nên nghiêm trọng nếu ứng dụng này là một chương trình thuộc hệ thống, và rõ ràng sẽ không có gì đảm bảo cho sự an toàn của hệ thống chúng ta. Để giải quyết vấn đề trên, hãy sử dụng hàm CallNextHookEx, khai báo của nó như sau :

LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam );

hhk : là handle của hook hiện hành, giá trị này có thể lấy được từ hàm SetWindowsHookEx khi cài đặt hook.

nCode : chỉ định hook code để gởi đến hook kế tiếp. Hàm xử lý hook dùng giá trị này để chỉ định xử lý thông điệp được gởi từ hook như thế nào .

wParam: chỉ định 16 bits thông tin mở rộng của thông điệp.

lParam: chỉ định 32 bits thông tin mở rộng của thông điệp.

Giá trị trả về : giá trị trả về là kết quả của quá trình xử lý và tùy thuộc vào thông số nCode

Trong một số tình huống, Filter Function hiện hành có thể không muốn chuyển sự kiện cho Filter Function khác trong cùng một chuỗi. Lúc này, nếu loại hook chúng ta đang cài đặt cho phép huỷ bỏ sự kiện, và Filter Function của chúng ta cũng có cùng quyết định là hủy bỏ, nó sẽ không phải gọi hàm CallNextHookEx.

5. Chương trình minh họa

Để hiểu rõ hơn về Hook ,các bạn có thể xem một ví dụ đơn giản về sử dụng Hook. Trong ví dụ này chúng ta sẽ cài đặt một Hook ,cho phép đọc thông tin về menu bar chuẩn của bất kỳ chương trình ứng dụng nào và lưu các thông tin này thành một tập tin resource (để sau đó ta có thể dễ dàng sử dụng trong chương trình của mình!)

Trong ví dụ này chúng ta sẽ sử dụng Hook WH_GETMESSAGE để chặn bắt các thông điệp gửi đến hàng đợi thông điệp . Và khi chương trình của chúng ta bắt được thông điệp WM_NCLBUTTONDOWN (thông điệp này đuợc phát sinh khi chúng ta click chuột lện thanh tiêu đề của cửa sổ) , chương trình sẽ cho mở hộp thoại Save As để cho nguời dùng chọn đường dẫn và đặt tên cho file resource sẽ được tạo ra .Và lúc này chuơng trình sẽ lưu toàn bộ nội dung của menubar xuống thành file resource mà chúng ta đã đặt tên.

* Trong ví dụ này vì ta muốn lấy thông tin về menu bar của tất cả ứng dụng trên Windows nên ta phải sử dụng một tập tin .DLL để lập một Hook loại toàn cục (còn các hook loại cục bộ chỉ cho phép chặn các thông điệp trong nội bộ ứng dụng có cài đặt Hook mà thôi).


(Kô nhớ tên tác giả)
[Up] [Print Copy]
  [Question]   GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 03/07/2006 03:18:22 (+0700) | #2 | 3227
[Avatar]
thuanld
Member

[Minus]    0    [Plus]
Joined: 26/04/2005 14:29:07
Messages: 10
Offline
[Profile] [PM]
Bài viết hay, nhưng mà chưa thấy ví dụ đâu cả nên tui vẫn thấy mù mờ. Đề nghị tác giả đưa ví dụ lên nhé.
[Up] [Print Copy]
  [Question]   GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 03/07/2006 20:49:59 (+0700) | #3 | 3421
[Avatar]
thuanld
Member

[Minus]    0    [Plus]
Joined: 26/04/2005 14:29:07
Messages: 10
Offline
[Profile] [PM]
//Đây là code viết trong C#
using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Threading;

using System.Windows.Forms;


namespace GlobalHookDemo {

/// <summary>
/// This class allows you to tap keyboard and mouse and / or to detect their activity even when an
/// application runes in background or does not have any user interface at all. This class raises
/// common .NET events with KeyEventArgs and MouseEventArgs so you can easily retrive any information you need.
/// </summary>
/// <remarks>
/// created by - Georgi
/// created on - 22.05.2004 13:08:01
/// </remarks>
public class UserActivityHook : object {

/// <summary>
/// Default constructor - starts hooks automatically
/// </summary>
public UserActivityHook() {
Start();
}

~UserActivityHook() {
Stop();
}

public event MouseEventHandler OnMouseActivity;
public event KeyEventHandler KeyDown;
public event KeyPressEventHandler KeyPress;
public event KeyEventHandler KeyUp;

public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);

static int hMouseHook = 0; //Declare mouse hook handle as int.
static int hKeyboardHook = 0; //Declare keyboard hook handle as int.

//values from Winuser.h in Microsoft SDK.
public const int WH_MOUSE_LL = 14; //mouse hook constant
public const int WH_KEYBOARD_LL = 13; //keyboard hook constant

HookProc MouseHookProcedure; //Declare MouseHookProcedure as HookProc type.
HookProc KeyboardHookProcedure; //Declare KeyboardHookProcedure as HookProc type.


//Declare wrapper managed POINT class.
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}

//Declare wrapper managed MouseHookStruct class.
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}

//Declare wrapper managed KeyboardHookStruct class.
[StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode; //Specifies a virtual-key code. The code must be a value in the range 1 to 254.
public int scanCode; // Specifies a hardware scan code for the key.
public int flags; // Specifies the extended-key flag, event-injected flag, context code, and transition-state flag.
public int time; // Specifies the time stamp for this message.
public int dwExtraInfo; // Specifies extra information associated with the message.
}


//Import for SetWindowsHookEx function.
//Use this function to install a hook.
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn,
IntPtr hInstance, int threadId);

//Import for UnhookWindowsHookEx.
//Call this function to uninstall the hook.
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);

//Import for CallNextHookEx.
//Use this function to pass the hook information to next hook procedure in chain.
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode,
Int32 wParam, IntPtr lParam);

public void Start()
{
// install Mouse hook
if(hMouseHook == 0)
{
// Create an instance of HookProc.
MouseHookProcedure = new HookProc(MouseHookProc);

hMouseHook = SetWindowsHookEx( WH_MOUSE_LL,
MouseHookProcedure,
Marshal.GetHINSTANCE(
Assembly.GetExecutingAssembly().GetModules()[0]),
0);

//If SetWindowsHookEx fails.
if(hMouseHook == 0 ) {
Stop();
throw new Exception("SetWindowsHookEx failed.");
}
}

// install Keyboard hook
if(hKeyboardHook == 0)
{
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL,
KeyboardHookProcedure,
Marshal.GetHINSTANCE(
Assembly.GetExecutingAssembly().GetModules()[0]),
0);

//If SetWindowsHookEx fails.
if(hKeyboardHook == 0 ) {
Stop();
throw new Exception("SetWindowsHookEx ist failed.");
}
}
}

public void Stop()
{
bool retMouse =true;
bool retKeyboard = true;
if(hMouseHook != 0)
{
retMouse = UnhookWindowsHookEx(hMouseHook);
hMouseHook = 0;
}

if(hKeyboardHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = 0;
}

//If UnhookWindowsHookEx fails.
if (!(retMouse && retKeyboard)) throw new Exception("UnhookWindowsHookEx failed.");
}



private const int WM_MOUSEMOVE = 0x200;
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_RBUTTONDOWN = 0x204;
private const int WM_MBUTTONDOWN = 0x207;
private const int WM_LBUTTONUP = 0x202;
private const int WM_RBUTTONUP = 0x205;
private const int WM_MBUTTONUP = 0x208;
private const int WM_LBUTTONDBLCLK = 0x203;
private const int WM_RBUTTONDBLCLK = 0x206;
private const int WM_MBUTTONDBLCLK = 0x209;

private int MouseHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
// if ok and someone listens to our events
if ((nCode >= 0) && (OnMouseActivity!=null)) {

MouseButtons button=MouseButtons.None;
switch (wParam)
{
case WM_LBUTTONDOWN:
//case WM_LBUTTONUP:
//case WM_LBUTTONDBLCLK:
button=MouseButtons.Left;
break;
case WM_RBUTTONDOWN:
//case WM_RBUTTONUP:
//case WM_RBUTTONDBLCLK:
button=MouseButtons.Right;
break;
}
int clickCount=0;
if (button!=MouseButtons.None)
if (wParam==WM_LBUTTONDBLCLK || wParam==WM_RBUTTONDBLCLK) clickCount=2;
else clickCount=1;

//Marshall the data from callback.
MouseHookStruct MyMouseHookStruct = (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
MouseEventArgs e=new MouseEventArgs(
button,
clickCount,
MyMouseHookStruct.pt.x,
MyMouseHookStruct.pt.y,
0 );
OnMouseActivity(this, e);
}
return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}


//The ToAscii function translates the specified virtual-key code and keyboard state to the corresponding character or characters. The function translates the code using the input language and physical keyboard layout identified by the keyboard layout handle.
[DllImport("user32")]
public static extern int ToAscii(int uVirtKey, //[in] Specifies the virtual-key code to be translated.
int uScanCode, // [in] Specifies the hardware scan code of the key to be translated. The high-order bit of this value is set if the key is up (not pressed).
byte[] lpbKeyState, // [in] Pointer to a 256-byte array that contains the current keyboard state. Each element (byte) in the array contains the state of one key. If the high-order bit of a byte is set, the key is down (pressed). The low bit, if set, indicates that the key is toggled on. In this function, only the toggle bit of the CAPS LOCK key is relevant. The toggle state of the NUM LOCK and SCROLL LOCK keys is ignored.
byte[] lpwTransKey, // [out] Pointer to the buffer that receives the translated character or characters.
int fuState); // [in] Specifies whether a menu is active. This parameter must be 1 if a menu is active, or 0 otherwise.

//The GetKeyboardState function copies the status of the 256 virtual keys to the specified buffer.
[DllImport("user32")]
public static extern int GetKeyboardState(byte[] pbKeyState);

private const int WM_KEYDOWN = 0x100;
private const int WM_KEYUP = 0x101;
private const int WM_SYSKEYDOWN = 0x104;
private const int WM_SYSKEYUP = 0x105;

private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
// it was ok and someone listens to events
if ((nCode >= 0) && (KeyDown!=null || KeyUp!=null || KeyPress!=null))
{
KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct) Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
// raise KeyDown
if ( KeyDown!=null && ( wParam ==WM_KEYDOWN || wParam==WM_SYSKEYDOWN ))
{
// Keys keyData=(Keys)MyKeyboardHookStruct.vkCode;
// KeyEventArgs e = new KeyEventArgs(keyData);
// KeyDown(this, e);
}

// raise KeyPress
if ( KeyPress!=null && wParam ==WM_KEYDOWN )
{
byte[] keyState = new byte[256];
GetKeyboardState(keyState);

byte[] inBuffer= new byte[2];
if (ToAscii(MyKeyboardHookStruct.vkCode,
MyKeyboardHookStruct.scanCode,
keyState,
inBuffer,
MyKeyboardHookStruct.flags)==1)
{
KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);
KeyPress(this, e);
}
}

// raise KeyUp
if ( KeyUp!=null && ( wParam ==WM_KEYUP || wParam==WM_SYSKEYUP ))
{
// Keys keyData=(Keys)MyKeyboardHookStruct.vkCode;
// KeyEventArgs e = new KeyEventArgs(keyData);
// KeyUp(this, e);
}

}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
}
}
[Up] [Print Copy]
  [Question]   GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 02/09/2006 14:07:32 (+0700) | #4 | 20129
romantic1984r
Member

[Minus]    0    [Plus]
Joined: 11/07/2004 01:45:51
Messages: 3
Location: Ha Noi
Offline
[Profile] [PM] [Yahoo!]
Anh có code viết trong VB.Net hay C++ ko Em chưa học c## bao giờ nên khó hiểu quá

Và Anh có thể giải thích các thủ tục gì làm cái gì dc không cho mọi người dễ hiểu hơn nhất là những người ko biêt nhiều ngôn ngữ này
[Up] [Print Copy]
  [Question]   GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 02/09/2006 17:44:15 (+0700) | #5 | 20145
[Avatar]
dmlong
Member

[Minus]    0    [Plus]
Joined: 12/08/2006 08:29:05
Messages: 4
Offline
[Profile] [PM]
Nhờ ông Google đi , smilie
Hoặc vào codeproject.com
[Up] [Print Copy]
  [Question]   GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 02/09/2006 22:49:02 (+0700) | #6 | 20160
vy
Member

[Minus]    0    [Plus]
Joined: 29/06/2006 12:54:03
Messages: 31
Offline
[Profile] [PM]
Đây là ví dụ của bài viết trên:

http://rapidshare.de/files/31638886/HOOK.ZIP
[Up] [Print Copy]
  [Question]   Re: GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 09/04/2009 07:00:26 (+0700) | #7 | 176278
holigan20092003
Member

[Minus]    0    [Plus]
Joined: 23/05/2008 23:41:57
Messages: 4
Offline
[Profile] [PM]
link ví dụ bị die rồi bạn ơi.check lại dùm minh nhà thanhks...
[Up] [Print Copy]
  [Question]   Re: GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 09/04/2009 07:18:33 (+0700) | #8 | 176279
[Avatar]
Z0rr0
Q+WRtaW5pc3RyYXRvc+g

Joined: 14/08/2002 12:52:01
Messages: 1323
Location: Underground
Offline
[Profile] [PM] [WWW] [Yahoo!]
Mấy bạn vui lòng đọc kĩ hướng dẫn viết bài, bố trí bài cho rõ ràng để dễ đọc. Copy/paste kiểu này rất khó cho thành viên khác xem.
Hibernating
[Up] [Print Copy]
  [Question]   Re: GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 13/04/2009 22:52:07 (+0700) | #9 | 176992
[Avatar]
bln102
Member

[Minus]    0    [Plus]
Joined: 07/01/2009 16:50:22
Messages: 20
Offline
[Profile] [PM]
Nếu để ý kỹ có lẽ nhiều người sẽ thấy rằng cơ chế hook không chuẩn. Điển hình là Unikey, nó không thể gõ được cho các Rich Text Box của các framework đa nền như: GTK+ (chương trình chat Pidgin), wxWigets (lib richtext). Cách giải quyết hiện tại là khá tệ: sử dụng clipboard khi bỏ dấu.
[Up] [Print Copy]
  [Question]   Re: GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 13/04/2009 23:45:32 (+0700) | #10 | 176998
[Avatar]
H3x4
Member

[Minus]    0    [Plus]
Joined: 02/04/2009 00:03:16
Messages: 242
Offline
[Profile] [PM]

Hiện nay có thể sử dụng Detours do M$ cung cấp, việc sử dụng nó sẽ làm quá trình Hook đơn giản hơn nhiều . Chi tiết có thể lên Codeproject hoặc coi sample của nó là được .
[Up] [Print Copy]
  [Programming]   GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 03/09/2009 22:05:53 (+0700) | #11 | 191895
[Avatar]
toitammatmay
Member

[Minus]    0    [Plus]
Joined: 08/07/2006 20:49:26
Messages: 40
Offline
[Profile] [PM] [Email]
bài viết rất hay.thanks
[Up] [Print Copy]
  [Programming]   GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 12/06/2010 15:52:03 (+0700) | #12 | 213143
pandacr
Member

[Minus]    0    [Plus]
Joined: 10/06/2010 22:27:00
Messages: 2
Offline
[Profile] [PM]
smilie
chào các bạn!!
cho mình hỏi ti?
mình đang làm từ điển và đang lam chức năng click 'n' see.
nên cần tìm hiểu về hook trong c#
mình đã tìm hiểu sơ sơ về hàm API
có bạn nào có tài liệu hay về click 'n' see cho mình xin với!!
có code cụ thể thi càng tôt!
bạn nào có code về WH_MOUSE cho xin đọc tí.
làm sao để lấy được text dưới con trỏ chuột bất cứ đâu trên màn hình bỏ vào combobox!!
trong c# nha!!
thanks a lot!!!
[Up] [Print Copy]
  [Programming]   GIỚI THIỆU VỀ KỸ THUẬT LẬP TRÌNH HOOK 31/03/2011 06:28:56 (+0700) | #13 | 234306
qhhqnavy
Member

[Minus]    0    [Plus]
Joined: 30/12/2010 07:09:30
Messages: 4
Offline
[Profile] [PM]
cám ơn mấy anh hai nhiều.
bài viết của anh thật hữu ích.
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|