zoukankan      html  css  js  c++  java
  • HOOK

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //
    //    全局钩子: 监控程序的最大化.最小化
    //
    #ifndef        __HOOK_WINDOW_H_2016_10_12__
    #define        __HOOK_WINDOW_H_2016_10_12__
    
    
    #ifdef        __cplusplus
    #define        EXPORT extern "C" __declspec(dllexport)
    #else
    #define        EXPORT __declspec(dllexport)
    #endif    // __cplusplus
    
    
    // 安装钩子
    EXPORT void SetHook(HWND hGameWnd);
    // 卸载钩子
    EXPORT void UnSetHook(void);
    
    #endif
    
    //========================================
    #include <atlstr.h>
    #include <Windows.h>
    #include <tchar.h>
    #include "fkDLL.h"
    
    
    // 共享数据
    #pragma data_seg("ShardData")
    HWND g_hGameWnd = NULL;
    #pragma data_seg()
    #pragma comment(linker,"/SECTION:ShardData,RWS")
    
    static HINSTANCE g_hInstance = NULL;
    static HHOOK g_hHook = NULL;
    static HHOOK g_hMsg = NULL;
    
    // WH_GETMESSAGE
    LRESULT CALLBACK GetMsgProc(int iCode, WPARAM wParam, LPARAM lParam)
    {
        if (iCode < 0 || iCode == HC_NOREMOVE)
        {
            return CallNextHookEx(g_hMsg, iCode, wParam, lParam);
        }
    
        PMSG pMsg = (PMSG)lParam;
        if (g_hGameWnd == pMsg->hwnd)
        {
            switch (pMsg->message)
            {
            case WM_SYSCOMMAND:
                if (SC_MINIMIZE == pMsg->wParam) //截获最小化
                {
                    OutputDebugString(_T("GameTips:    -    截获了最小化消息"));
                    pMsg->message = WM_NULL;    //将消息重置为WM_NULL,就达到截获的目的.
                }
                else if (SC_CLOSE == pMsg->wParam)
                {
                    OutputDebugString(_T("GameTips:    -    截获了关闭消息"));
                    pMsg->message = WM_NULL;    //将消息重置为WM_NULL,就达到截获的目的.
                }
                break;
                
            case WM_NCLBUTTONDOWN:
                if (HTMINBUTTON == pMsg->wParam)
                {
                    OutputDebugString(_T("GameTips:    -    截获了最小化按钮消息"));
                    pMsg->message = WM_NULL;    //将消息重置为WM_NULL,就达到截获的目的.
                }
                else if (HTCLOSE == pMsg->wParam)
                {
                    OutputDebugString(_T("GameTips:    -    截获了关闭按钮消息"));
                    pMsg->message = WM_NULL;    //将消息重置为WM_NULL,就达到截获的目的.
                }
                break;
    
            case WM_KEYDOWN:
                if (VK_F11 == pMsg->wParam)
                {
                    OutputDebugString(_T("GameTips:    -    截获了F11"));
                    pMsg->message = WM_NULL;    //将消息重置为WM_NULL,就达到截获的目的.
                }
            }
        }
        return CallNextHookEx(g_hMsg, iCode, wParam, lParam);
    }
    
    // 安装钩子
    EXPORT void SetHook(HWND hGameWnd)
    {
        if (g_hMsg == NULL)
        {
            g_hGameWnd = hGameWnd;
            g_hMsg = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, g_hInstance, 0);
        }
    }
    
    // 卸载钩子
    EXPORT void UnSetHook(void)
    {
        if (g_hMsg)
        {
            UnhookWindowsHookEx(g_hMsg);
            g_hMsg = NULL;
        }
    }
    
    
    // 钩子主函数
    int WINAPI DllMain(HINSTANCE hDllInstance, DWORD dwReason, LPVOID lpreserved)
    {
    
        switch (dwReason)
        {
        case DLL_PROCESS_ATTACH:
            //保存实例句柄
            g_hInstance = hDllInstance;
            break;
    
        case DLL_THREAD_ATTACH:
    
            break;
    
        case DLL_THREAD_DETACH:
            break;
    
        case DLL_PROCESS_DETACH:
            break;
        }
    
        return TRUE;
    }
    
    =========================================
    XXDLG调用:
    //安装钩子
    void XXDLG::InstallHook(HWND hWnd)
    {
        // 安装CBT钩子
        if (m_hDLL == NULL)
        {
            m_hDLL = LoadLibrary(_T("fuckDLL.dll"));
            ASSERT(m_hDLL);
            typedef void(*SET_HOOK)(HWND);
            SET_HOOK pSetHook = (SET_HOOK)GetProcAddress(m_hDLL, "SetHook");
            ASSERT(pSetHook);
            pSetHook(hWnd);
        }
    }
    
    //卸载钩子
    void XXDLG::UnInstallHook()
    {
        if (m_hDLL)
        {
            typedef void(*UN_SET_HOOK)(void);
            UN_SET_HOOK pUnSetHook = (UN_SET_HOOK)GetProcAddress(m_hDLL, "UnSetHook");
            ASSERT(pUnSetHook);
            pUnSetHook();
            FreeLibrary(m_hDLL);
            m_hDLL = NULL;
        }
    }
  • 相关阅读:
    filebeat测试output连通性
    es分片数相关知识
    Elasticsearch的mapping讲解
    Kibana插件
    Kibana管理
    Kibana控制台(Dev Tools) Console
    Kibana仪表盘(Dashboard)详解
    Kibana可视化数据(Visualize)详解
    Kibana探索数据(Discover)详解
    Kibana使用仪表盘汇总数据(Dashboard)
  • 原文地址:https://www.cnblogs.com/DuanLaoYe/p/5984658.html
Copyright © 2011-2022 走看看