鉤子的應用

HHOOK SetWindowsHookEx(--->新建一個HOOK過程添加到HOOK鏈中,最後添加進去的,在HOOK鏈最前
  int idHook,        // hook type---》鉤子類型
  HOOKPROC lpfn,     // hook procedure--》鉤子過程指針
  HINSTANCE hMod,    // handle to application instance  ---》如果是當前進程的HOOK過程,則設置爲NULL
  DWORD dwThreadId   // thread identifier---》如果這個爲0或者爲不同的進程構建的HOOK過程指針,則lpfn爲動態鏈接庫中的HOOK過程
);  


DWORD GetCurrentThreadId(VOID);--》獲得當前線程的ID

VK_0-VK_9 鍵盤上的0到9
VK_A-VK_Z 鍵盤上的A-Z

BOOL UnhookWindowsHookEx(
  HHOOK hhk   // handle to hook procedure
);---》從hook鏈中刪除某個HOOK過程

如何建立鍵盤HOOK和鼠標hook?
低下只顯示需要添加的代碼,其他的就不顯示了
HHOOK g_hMouse = NULL;
HHOOK g_hKeyboard=NULL;---》定義全局變量
HWND g_hWnd=NULL;
LRESULT CALLBACK MouseProc(
  int nCode,      // hook code
  WPARAM wParam,  // message identifier
  LPARAM lParam   // mouse coordinates
)
{
    return 1;----》屏蔽所有鼠標點擊事件
}

LRESULT CALLBACK KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{
//    if(VK_SPACE==wParam  VK_RETURN==wParam)
/*    if(VK_F4==wParam && (1==(lParam>>29 & 1)))----》如何屏蔽組合鍵ALT+F4
        return 1;
    else
        return CallNextHookEx(g_hKeyboard,code,wParam,lParam);*/
    if(VK_F2==wParam)
    {
        ::SendMessage(g_hWnd,WM_CLOSE,0,0);
        UnhookWindowsHookEx(g_hKeyboard);
        UnhookWindowsHookEx(g_hMouse);
    }
    return 1;
}

BOOL CInnerHookDlg::OnInitDialog()
{
    g_hWnd = m_hWnd;---》獲取當前句柄
    g_hMouse = SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());
    g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());
    return TRUE;  
}


如何使用動態鏈接庫來產生一個hook應用?
BOOL SetWindowPos (
const CWnd* pWndInsertAfter,
int x,
int y,
int cx,
int cy,
UINT nFlags );
這裏使用自定義模塊來實現一個動態鏈接庫,
#include <windows.h>

HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;
HWND g_hWnd=NULL;
LRESULT CALLBACK KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{
    if(VK_F2==wParam)
    {
        SendMessage(g_hWnd,WM_CLOSE,0,0);
        UnhookWindowsHookEx(g_hMouse);
        UnhookWindowsHookEx(g_hKeyboard);
    }
    return 1;
}

LRESULT CALLBACK MouseProc(
  int nCode,      // hook code
  WPARAM wParam,  // message identifier
  LPARAM lParam   // mouse coordinates
)
{
    return 1;
}

void SetHook(HWND hwnd)
{
    g_hWnd=hwnd;
    g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);
    g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
}

在DEF文件中寫入:
LIBRARY Hook
EXPORTS
SetHook        @2---》@2爲序列號,由此設置



而在別處調用的時候是:
_declspec(dllimport) void SetHook(HWND hwnd);

BOOL CHookTestDlg::OnInitDialog()
{
    int cxScreen,cyScreen;
    cxScreen=GetSystemMetrics(SM_CXSCREEN);
    cyScreen=GetSystemMetrics(SM_CYSCREEN);
    SetWindowPos(&wndTopMost,0,0,cxScreen,cyScreen,SWP_SHOWWINDOW);
    SetHook(m_hWnd);

    return TRUE; 
}


以上的代碼將當前彈出的窗口失去焦點,點擊F2,則無法退出頁面,那麼
如何讓多個進程共享這個代碼呢?

在命令提示符中 dumbin -headers Hook.dll 查看dll生成的節信息

將上面代碼更改爲:
#include <windows.h>

HHOOK g_hMouse=NULL;
HHOOK g_hKeyboard=NULL;
 

#pragma data_seg("MySec")
HWND g_hWnd=NULL;----》注意此處要賦值爲NULL,否則在節信息裏看不到節信息
#pragma data_seg()

#pragma comment(linker,"/section:MySec,RWS")--》RWS爲read write share 的縮寫 創建共享
 

創建共享節還可以再DEF文件裏寫入
LIBRARY Hook
EXPORTS
SetHook        @2
SEGMENTS
MySec    READ WRITE SHARED




BOOL WINAPI DllMain(
  HINSTANCE hinstDLL,  // handle to the DLL module
  DWORD fdwReason,     // reason for calling function
  LPVOID lpvReserved   // reserved
)
{
    g_hInst=hinstDLL;
}
*/
HC_ACTION
LRESULT CALLBACK KeyboardProc(
  int code,       // hook code
  WPARAM wParam,  // virtual-key code
  LPARAM lParam   // keystroke-message information
)
{
    if(VK_F2==wParam)
    {
        SendMessage(g_hWnd,WM_CLOSE,0,0);
        UnhookWindowsHookEx(g_hMouse);
        UnhookWindowsHookEx(g_hKeyboard);
    }
    return 1;
}

LRESULT CALLBACK MouseProc(
  int nCode,      // hook code
  WPARAM wParam,  // message identifier
  LPARAM lParam   // mouse coordinates
)
{
    return 1;
}

void SetHook(HWND hwnd)
{
    g_hWnd=hwnd;
    g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);
    g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,GetModuleHandle("Hook"),0);
}

這樣即使生成的窗口失去焦點,則按F2鍵,則依然會將生成的窗口退出,這樣就建立了多個進程共享此代碼事件

如何獲取動態鏈接庫的句柄?
1.BOOL WINAPI DllMain(
  HINSTANCE hinstDLL,  // handle to the DLL module
  DWORD fdwReason,     // reason for calling function
  LPVOID lpvReserved   // reserved
);中包含了實例句柄,則定義一個全局變量,
HINSTANCE g_hInst;
應用如下:
BOOL WINAPI DllMain(
  HINSTANCE hinstDLL,  // handle to the DLL module
  DWORD fdwReason,     // reason for calling function
  LPVOID lpvReserved   // reserved
)
{
    g_hInst=hinstDLL;
}
2.
HMODULE GetModuleHandle(
  LPCTSTR lpModuleName   // module name
);
應用如下:
GetModuleHandle("HOOK");

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章