• 钩子注入呼出与隐藏DLL窗口


    / MFC_DLL.cpp : 定义 DLL 的初始化例程。
    //
    
    #include "stdafx.h"
    #include "MFC_DLL.h"
    #include "WgDlg.h"
    #include <Windows.h>
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    CWgDlg * GameForm = NULL;
    HWND GameHwnd = NULL;
    
    void StartHook();
    //
    //TODO:  如果此 DLL 相对于 MFC DLL 是动态链接的,
    //        则从此 DLL 导出的任何调入
    //        MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
    //        该函数的最前面。
    //
    //        例如: 
    //
    //        extern "C" BOOL PASCAL EXPORT ExportedFunction()
    //        {
    //            AFX_MANAGE_STATE(AfxGetStaticModuleState());
    //            // 此处为普通函数体
    //        }
    //
    //        此宏先于任何 MFC 调用
    //        出现在每个函数中十分重要。  这意味着
    //        它必须作为函数中的第一个语句
    //        出现,甚至先于所有对象变量声明,
    //        这是因为它们的构造函数可能生成 MFC
    //        DLL 调用。
    //
    //        有关其他详细信息,
    //        请参阅 MFC 技术说明 33 和 58。
    //
    
    // CMFC_DLLApp
    
    BEGIN_MESSAGE_MAP(CMFC_DLLApp, CWinApp)
    END_MESSAGE_MAP()
    
    
    // CMFC_DLLApp 构造
    
    CMFC_DLLApp::CMFC_DLLApp()
    {
        // TODO:  在此处添加构造代码,
        // 将所有重要的初始化放置在 InitInstance 中
    }
    
    
    // 唯一的一个 CMFC_DLLApp 对象
    
    CMFC_DLLApp theApp;
    CWgDlg * pWgdlg;
    DWORD WINAPI ShowWgdlg(LPARAM lpData)
    {
        StartHook();
    
        MSG msg;
        while (GetMessage(&msg, NULL, 0, 0)){
    
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        }
        
        return TRUE;
    }
    // CMFC_DLLApp 初始化
    
    BOOL CMFC_DLLApp::InitInstance()
    {
        CWinApp::InitInstance();
        ::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ShowWgdlg, NULL, NULL, NULL);
        return TRUE;
    }
    //钩子回调函数
    LRESULT CALLBACK GameProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        PMSG pMsg = (PMSG)lParam;
        if (pMsg->message == WM_KEYUP)
        {
            if (pMsg->wParam == VK_HOME)
            {
                if (GameForm == NULL)
                {
                    GameHwnd = pMsg->hwnd;
                    GameForm = new CWgDlg();
                    GameForm->Create(IDD_DIALOG_WG);
                    GameForm->ShowWindow(TRUE);
                }
                else
                if (GameForm->IsWindowVisible())
                {
                    GameForm->ShowWindow(FALSE);
                }
                else
                {
    
                    GameForm->ShowWindow(TRUE);
                }
            }
        }
        return CallNextHookEx(0, nCode, wParam, lParam);
    }
    //安装钩子
    void StartHook()
    {
            sleep(5000);
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        HWND hGame = FindWindow(_T("Notepad++"), NULL);
        if (hGame == 0)
        {
            MessageBox(NULL, _T("未找到"), _T("提示"), NULL);
            return;
        }
        DWORD tid = GetWindowThreadProcessId(hGame, NULL);
        ::SetWindowsHookEx(WH_GETMESSAGE, GameProc, ::GetModuleHandle(_T("MFC_DLL.dll")), tid);
    
    }
  • 相关阅读:
    matlab中用来批量读取的dir函数
    cat 函数应用
    线性移不变系统
    为什么低频信息描述了图像在光滑部位的整体灰度信息,而高频部分则反映了图像在边缘、噪声等细节方面的表现?
    红灯检测宇视科技专利分析与总结2
    红灯检测宇视科技专利分析与总结1
    matlab中冒号的用法
    第一篇博文,大橙子的博客生涯要开始啦
    Spring Boot和Shiro整合
    Spring Boot + Redis使用短信平台发送验证码(腾讯云短信平台)
  • 原文地址:https://www.cnblogs.com/wumac/p/4488811.html
Copyright © 2020-2023  润新知