/ 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);
}