钩子注入呼出与隐藏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);

}
原文地址:https://www.cnblogs.com/wumac/p/4488811.html