Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: HOOK và những gì liên quan đến DLL

  1. #1
    Ngày gia nhập
    04 2008
    Bài viết
    244

    Mặc định HOOK và những gì liên quan đến DLL

    1. Bước 1:

    Trước hết, tạo một Project VC++ Win32 DLL (xin đừng nhầm với dạng DLL Class Library) với 1 file duy nhất có nội dung như sau:

    File “TestDLL.cpp”


    Code:
    C++ Code:
    1. #include <windows.h>
    2.  
    3. //vùng nhớ dùng chung, chứa biến handle của Hook
    4. #pragma data_seg("SHARED_DATA")
    5. HHOOK   hGlobalHook = NULL;
    6. #pragma data_seg()
    7.  
    8. //hàm lọc sự kiện nhấn phím
    9. __declspec(dllexport) LRESULT CALLBACK FillKeyboard(int nCode, WPARAM wParam, LPARAM lParam)
    10. {
    11.     //nếu sự kiện là nhấn phím và mã phím là Enter
    12.     if ((nCode == HC_ACTION) && (wParam == 13))
    13.     {
    14.         MessageBox(0, "sonhn say hello :)", "Hello", 0);
    15.         return 1;
    16.     }
    17.  
    18.     //gọi Filter Function kế tiếp trong chuỗi các Filter Function
    19.     return CallNextHookEx(hGlobalHook, nCode, wParam, lParam);
    20. }
    21.  
    22. //hàm ấn định biến hGlobalHook tại vùng nhớ dùng chung
    23. __declspec(dllexport) void SetGlobalHookHandle(HHOOK hHook)
    24. {
    25.    hGlobalHook = hHook;
    26. }
    Đoạn code trên có 3 điểm cần chú ý:
    - Đoạn khai báo vùng nhớ dùng chung “SHARED_DATA”: vùng nhớ này chứa handle của Hook được cài. Sở dĩ nó phải được đặt trong vùng nhớ dùng chung vì cả 2 chương trình (DLL và EXE) đều cần truy phải truy xuất vào.
    - Hàm lọc sự kiện nhấn phím: hàm này thực hiện nhiệm vụ: khi sự kiện là nhấn phím (nCode == HC_ACTION) và phím được nhấn là Enter (wParam == 13) thì “bắn” cái message box ra.
    - Hàm ấn định biến hGlobalHook: hàm này sẽ được gọi bởi chương trình EXE sau đây để ấn định handle cho Hook mà nó sẽ cài.

    Tạo file Module-Definition (.def) có nội dung như bên dưới để export các hàm bên trong file DLL và khai báo vùng nhớ dùng chung.

    File “TestDLL.def”



    C++ Code:
    1. LIBRARY "TestDLL"
    2. EXPORTS
    3.     FillKeyboard
    4.     SetGlobalHookHandle
    5.     SECTIONS
    SHARED_DATA Read Write SharedBiên project trên để thu được file “TestDLL.dll”

    2. Bước 2:

    Tạo project VC++ dạng Win32 Application để thực hiện cài hàm lọc (trong file TestDLL.dll) vào sự kiện nhấn phím.

    File “TestHook.cpp”


    C++ Code:
    1. #include <windows.h>
    2.  
    3. //các biến toàn cục
    4. HHOOK hHook = NULL;     //handle của hook
    5. HMODULE hDll;           //handle của DLL
    6.  
    7. //định nghĩa con trỏ hàm SetGlobalHookHandle() trong file DLL
    8. typedef VOID (*LOADPROC)(HHOOK hHook);
    9.  
    10. BOOL InstallHook();
    11.  
    12. int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
    13. {
    14.     //cài đặt hook, exit nếu thất bại
    15.     if (InstallHook() == FALSE)
    16.     {
    17.         MessageBox(0, "Can not install hook!", "Error", 0);
    18.         return -1;
    19.     }
    20.  
    21.     MSG msg;
    22.     BOOL bRet;
    23.     //vòng lặp đón và xử lý các message
    24.     while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    25.     {
    26.         TranslateMessage(&msg);
    27.         DispatchMessage(&msg);
    28.     }
    29.  
    30.     return 0;
    31. }
    32.  
    33. //Hàm cài đặt hook
    34. BOOL InstallHook()
    35. {
    36.     //load file DLL
    37.     if (LoadLibrary("TestDLL.dll") == NULL)
    38.     {
    39.         MessageBox(0, "Can not load DLL file.", "Error", 0);
    40.         return FALSE;
    41.     }
    42.  
    43.     //lấy handle của file DLL
    44.     HMODULE hDLL = GetModuleHandle("TestDLL");
    45.  
    46.     //exit nếu load DLL không thành công
    47.     if (hDLL == NULL)
    48.     {
    49.         return FALSE;
    50.     }
    51.  
    52.     //cài đặt hook, phạm vi toàn cục
    53.     hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)GetProcAddress(hDLL,"FillKeyboard"), hDLL, 0);
    54.  
    55.     //exit nếu cài đặt Hook không thành công
    56.     if (hHook == NULL)
    57.     {
    58.         return FALSE;
    59.     }
    60.  
    61.     //lấy địa chỉ hàm SetGlobalHookHandle() trong file DLL
    62.     LOADPROC fPtrFcnt;
    63.     fPtrFcnt = (LOADPROC)GetProcAddress(hDLL, "SetGlobalHookHandle");
    64.     if (fPtrFcnt == NULL)
    65.     {
    66.         return FALSE;
    67.     }
    68.  
    69.     //ấn định handle của hook vào vùng nhớ dùng chung (giữa DLL và ứng dụng này)
    70.     fPtrFcnt(hHook);
    71.    
    72.     return TRUE;
    73. }
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 03-11-2008 lúc 09:11 AM.

  2. #2
    Ngày gia nhập
    05 2009
    Nơi ở
    Hà Nội
    Bài viết
    2

    Cho mình hỏi 1 vấn đề về hàm SetWindowsHookEx , tham số cuối cùng sẽ phải điền ntn nếu như hook chỉ là hook cục bộ ?
    Và bạn có tài liệu nào nói cụ thể chi tiết về 15 dạng Hook + các thông điệp đối với từng dạng hook đó .Viết ví dụ = Visual C++ càng tốt
    Thank nhiều !
    Cuộc sống trở nên vô nghĩa nếu không có bè bạn.
    Niềm vui sẽ không trọn vẹn nếu không được sẻ chia
    Kiến thức bao la nhưng không bao giờ học hết cả
    Chia sẻ cho nhau !Bạn ơi ,dù ta có cả vui buồn

  3. #3
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Nếu bạn muốn hook cục bộ thì tham số thứ 3 truyền vào là NULL. Tham số cuối bạn để là 0 cũng được, hoặc dùng hàm GetCurrentThreadId() để lấy. Tất cả mọi tài liệu về cái này đều có sẵn và rất đầy đủ trên MSDN.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  4. #4
    Ngày gia nhập
    05 2009
    Nơi ở
    Hà Nội
    Bài viết
    2

    Mình muốn hỏi thêm là , trong các ví dụ về hook trong Visual C++ 6.0 cục bộ thì có nhất thiết phải tạo Dll cho filter function ko hay khai báo nó trực tiếp trong chương trình chính
    Tiện đây bạn có thể cho mình xin nick Yahoo để tiện liên hệ không .Tuy rằng minh theo học CNTT đã lâu nhưng giờ mới đặt chân đến lĩnh vực này (Rất hay tuy nhiên mình lại chậm chân ) , do vậy cần người có KN chỉ bảo !
    Cảm ơn trước nhé (Đọc MSDN thì mình cũng chỉ hiểu khá mờ nhạt do vốn Tiếng Anh hạn hẹp,chính thế mới cần TL Tiếng việt cụ thể - Hiện tại mình cũng đang cố gắng củng cố KT Tiếng Anh luôn )
    Cuộc sống trở nên vô nghĩa nếu không có bè bạn.
    Niềm vui sẽ không trọn vẹn nếu không được sẻ chia
    Kiến thức bao la nhưng không bao giờ học hết cả
    Chia sẻ cho nhau !Bạn ơi ,dù ta có cả vui buồn

  5. #5
    Ngày gia nhập
    01 2009
    Bài viết
    165

    mình có làm 1 cái win 32 dll chỉ export 1 hàm LRESULT CALLBACK Proc(HWND,UINT,WPARAM,LPARAM) nhưng khi biên dịch thì CFree nó sinh ra file .def trong phần export thì tên hàm bị thay đổi dẫn đến việc ko load được hàm này trong ứng dụng khác nhưng nếu mình khai báo extern"C"__declspec(dllexport) Proc(HWND,UINT,WPARAM,LPARAM) thì trong file .def tên hàm ko bị thay đổi ,ai biết thì có thể giải thích cho mình hiểu được công dụng của từ khóa extern ko?

  6. #6
    Ngày gia nhập
    10 2009
    Bài viết
    86

    Mặc định HOOK và những gì liên quan đến DLL

    Hi hi mình làm và chạy đựoc, tuy chưa hiểu lắm, cho mình hỏi làm sao để biết toàn bộ mã bàn phím của mình, ví dụ 13 == enter ... thanks nhiều

  7. #7
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    _http://www.ascii-code.com

  8. #8
    Ngày gia nhập
    05 2012
    Bài viết
    2

    Code:
    hHook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC) GetProcAddress(hDLL,"FillKeyboard"), hDLL, 0);
    Các bác cho em hỏi : Sao đến đoạn này thì hHook == NULL vậy ??? .

  9. #9
    Ngày gia nhập
    05 2012
    Bài viết
    2

    Hix. Sao e làm như trong ví dụ bên trên nhưng nó báo lỗi cann't install HOOK . Bác nào có lòng hảo tâm thì pm giúp e với. Y!M e : yehn_kay

Các đề tài tương tự

  1. Lập trình C vấn đề liên quan đến đặc tả??
    Gửi bởi gyghung trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 7
    Bài viết cuối: 18-06-2012, 10:41 PM
  2. Các hàm API liên quan đến thư mục ổ đĩa
    Gửi bởi foreverlove trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 01-04-2010, 04:12 AM
  3. các bài liên quan đền đồ thị (mọi ngườ help em về ý tưởng với)
    Gửi bởi newbievnn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 03-12-2009, 06:00 AM
  4. Những thông tin liên quan đến HDH
    Gửi bởi lucky_little trong diễn đàn Thắc mắc chung
    Trả lời: 2
    Bài viết cuối: 05-09-2009, 09:40 AM
  5. HOOK và những gì liên quan đến DLL
    Gửi bởi honey trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 06-09-2008, 11:48 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn