Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 9 của 9
  1. #1

    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:

    Mã:
    #include <windows.h> //vùng nhớ dùng chung, chứa biến handle của Hook#pragma data_seg("SHARED_DATA")HHOOK   hGlobalHook = NULL;#pragma data_seg() //hàm lọc sự kiện nhấn phím__declspec(dllexport) LRESULT CALLBACK FillKeyboard(int nCode, WPARAM wParam, LPARAM lParam) {    /ếu sự kiện là nhấn phím và mã phím là Enter    if ((nCode == HC_ACTION) && (wParam == 13))    {        MessageBox(0, "sonhn say hello :)", "Hello", 0);        return 1;    }     //gọi Filter Function kế tiếp trong chuỗi các Filter Function    return CallNextHookEx(hGlobalHook, nCode, wParam, lParam);} //hàm ấn định biến hGlobalHook tại vùng nhớ dùng chung__declspec(dllexport) void SetGlobalHookHandle(HHOOK hHook){   hGlobalHook = hHook;}
    Đ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”




    Mã:
    LIBRARY "TestDLL"EXPORTS     FillKeyboard     SetGlobalHookHandle     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”



    Mã:
    #include <windows.h> //các biến toàn cụcHHOOK hHook = NULL;     //handle của hookHMODULE hDll;           //handle của DLL //định nghĩa con trỏ hàm SetGlobalHookHandle() trong file DLLtypedef VOID (*LOADPROC)(HHOOK hHook); BOOL InstallHook(); int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) {    //cài đặt hook, exit nếu thất bại    if (InstallHook() == FALSE)    {        MessageBox(0, "Can not install hook!", "Error", 0);        return -1;    }     MSG msg;    BOOL bRet;    //vòng lặp đón và xử lý các message     while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)    {         TranslateMessage(&msg);        DispatchMessage(&msg);    }     return 0;} //Hàm cài đặt hookBOOL InstallHook() {    //load file DLL    if (LoadLibrary("TestDLL.dll") == NULL)    {        MessageBox(0, "Can not load DLL file.", "Error", 0);        return FALSE;    }     //lấy handle của file DLL    HMODULE hDLL = GetModuleHandle("TestDLL");     //exit nếu load DLL không thành công    if (hDLL == NULL)    {        return FALSE;    }     //cài đặt hook, phạm vi toàn cục    hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)GetProcAddress(hDLL,"FillKeyboard"), hDLL, 0);     //exit nếu cài đặt Hook không thành công    if (hHook == NULL)    {        return FALSE;    }     //lấy địa chỉ hàm SetGlobalHookHandle() trong file DLL    LOADPROC fPtrFcnt;    fPtrFcnt = (LOADPROC)GetProcAddress(hDLL, "SetGlobalHookHandle");    if (fPtrFcnt == NULL)    {        return FALSE;    }     //ấn định handle của hook vào vùng nhớ dùng chung (giữa DLL và ứng dụng này)    fPtrFcnt(hHook);        return TRUE;}

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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 !

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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 )

  5. #5
    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 tham gia
    Sep 2015
    Bài viết
    0
    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 tham gia
    Sep 2015
    Bài viết
    0
    _http://www.ascii-code.com

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    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 tham gia
    Sep 2015
    Bài viết
    0
    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

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •