教程:HOOK API(一)-HOOK基础知识和鼠标钩示例(2)

电脑杂谈  发布时间:2020-09-25 21:04:08  来源:网络整理

还有一点要注意:系统挂钩必须放在单独的动态链接库中。因此,该程序分为两部分:一是钩子程序动态链接库,它实现了鼠标钩子程序。另一个是MFC操作窗口,它会加载和卸载DLL,即测试DLL。

c#鼠标钩子源码

新项目-> Visual C ++-> MFC DLL

 // 自定义消息
#define WM_HOOKMSG WM_USER + 106   

/* 共享代码段,所有线程共享 */
#pragma data_seg("SHARED")
static HHOOK hhkMouse = NULL;             // 鼠标钩子句柄
static HINSTANCE g_hInstance = NULL;   // 本DLL的实例句柄
static HWND g_hWnd = NULL;                // 调用DLL的主窗口句柄
#pragma data_seg()
#pragma comment(linker,"/section:SHARED,rws")

/* 定义低级鼠标子函数 */
LRESULT CALLBACK LowLevelMouseProc(int nCode,WPARAM wParam,LPARAM lParam){
    // 有鼠标消息时,将其发给主程序
    if ( g_hWnd != NULL && nCode == HC_ACTION) {
        ::SendMessage(g_hWnd,WM_HOOKMSG,wParam,lParam);
    }
    return CallNextHookEx(hhkMouse,nCode,wParam,lParam);
}

/* 安装低级鼠标子函数,从而截获系统所有的鼠标信息 */
BOOL WINAPI StartHookMouse(HWND hwnd){
    g_hWnd = hwnd;
    hhkMouse = SetWindowsHookEx(WH_MOUSE_LL,LowLevelMouseProc,g_hInstance,0);
    if ( NULL == hhkMouse) {
        return FALSE;
    } else{
        return TRUE;
    }
}

/* 卸载低级鼠标钩子 */
VOID WINAPI StopHookMouse(){
    if (hhkMouse != NULL) {
        ::UnhookWindowsHookEx(hhkMouse);
    }
}

/* 获取自身 DLL 句柄 */
BOOL ChookDllApp::InitInstance(){
    CWinApp::InitInstance();
    g_hInstance = ::AfxGetInstanceHandle();
    return TRUE;
}

hookDll.def文件,hook的加载和卸载功能:

; hookDll.def : 声明 DLL 的模块参数。
LIBRARY "MouseHook"
EXPORTS
; 此处可以是显式导出
StartHookMouse
StopHookMouse

/* 消息定义 */
#define WM_MOUSEMSG WM_USER + 106

/* 添加消息映射  */
BEGIN_MESSAGE_MAP(ChookWindowDlg, CDialogEx)
//…… ……

    ON_MESSAGE(WM_MOUSEMSG,&ChookWindowDlg::OnMouseMsg) //消息映射

END_MESSAGE_MAP()

/*
   鼠标钩子的加载和卸载
*/
HINSTANCE g_hInstanceDll = NULL;
//    启动鼠标钩子
void ChookWindowDlg::OnBnClickedButtonStart(){
    // TODO: 在此添加控件通知处理程序代码

    g_hInstanceDll = LoadLibrary(_T("hookDll.dll"));
    if (NULL == g_hInstanceDll){
        AfxMessageBox(_T("加载hookDll.dll失败"));
        return;
    }
    typedef BOOL (CALLBACK *StartHookMouse)(HWND hwnd);
    StartHookMouse startHook;
    startHook = (StartHookMouse) ::GetProcAddress(g_hInstanceDll,"StartHookMouse");
    if ( NULL == startHook ){
        AfxMessageBox(_T("获取 StartHookMouse 函数失败"));
        return;
    }
    if (startHook(this->m_hWnd)) {
        m_List.InsertItem(m_List.GetItemCount(),_T("0"));
        m_List.SetItemText(m_List.GetItemCount()-1,1,_T("0"));
        m_List.SetItemText(m_List.GetItemCount()-1,2,_T("启动鼠标钩子成功"));
    } else{
        m_List.InsertItem(m_List.GetItemCount(),_T("0"));
        m_List.SetItemText(m_List.GetItemCount()-1,1,_T("0"));
        m_List.SetItemText(m_List.GetItemCount()-1,2,_T("启动鼠标钩子失败"));
    }
}
 
// 停止鼠标钩子HOOK
void ChookWindowDlg::OnBnClickedButtonHook(){
    // TODO: 在此添加控件通知处理程序代码

    typedef VOID (CALLBACK *StopHookMouse)();
    StopHookMouse stopHook;
    g_hInstanceDll = LoadLibrary(_T("hookDll.dll"));
    if ( g_hInstanceDll == NULL) {
        AfxMessageBox(_T("加载DLL失败"));
        return;
    }
    stopHook = (StopHookMouse) ::GetProcAddress(g_hInstanceDll,"StopHookMouse");
    if (stopHook == NULL){
        m_List.InsertItem(m_List.GetItemCount(),_T("0"));
        m_List.SetItemText(m_List.GetItemCount()-1,1,_T("0"));
        m_List.SetItemText(m_List.GetItemCount()-1,2,_T("获取函数 StopHookMouse 失败"));
        return;
    }else{
        stopHook();
        m_List.InsertItem(m_List.GetItemCount(),_T("0"));
        m_List.SetItemText(m_List.GetItemCount()-1,1,_T("0"));
        m_List.SetItemText(m_List.GetItemCount()-1,2,_T("停止HOOKMOUSE成功"));
    }
    if (g_hInstanceDll != NULL){
        ::FreeLibrary(g_hInstanceDll);
    }
    // 确保list control 最后一行可见
    m_List.EnsureVisible(m_List.GetItemCount()-1,FALSE);
}

c#鼠标钩子源码

c#鼠标钩子源码

源代码

地址:

文件:MouseHook

参考


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-321890-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 韦纾
      韦纾

      宋茜也美美的@在法家拿到五冠王的瓦片

      • 李哲
        李哲

        它就是在展示一个“警告中国”的姿态

    热点图片
    拼命载入中...