www.pudn.com > 2007071212243513681.rar > Dialog4.cpp
// fun.cpp : 定义 DLL 的初始化例程。
//
#include "stdafx.h"
#include "fun.h"
#include "MyDlg.h"
#include "CallFun.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
HINSTANCE g_hInst = NULL;
HHOOK g_hKeyHook = NULL;
HWND g_hGameWindow = NULL;
BOOL g_bOK = FALSE;
HHOOK hKeyHook[20] = { 0 };
//
// 注意!
//
// 如果此 DLL 动态链接到 MFC
// DLL,从此 DLL 导出并
// 调入 MFC 的任何函数在函数的最前面
// 都必须添加 AFX_MANAGE_STATE 宏。
//
// 例如:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // 此处为普通函数体
// }
//
// 此宏先于任何 MFC 调用
// 出现在每个函数中十分重要。这意味着
// 它必须作为函数中的第一个语句
// 出现,甚至先于所有对象变量声明,
// 这是因为它们的构造函数可能生成 MFC
// DLL 调用。
//
// 有关其他详细信息,
// 请参阅 MFC 技术说明 33 和 58。
//
// CfunApp
BEGIN_MESSAGE_MAP(CfunApp, CWinApp)
END_MESSAGE_MAP()
// CfunApp 构造
CfunApp::CfunApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
m_pMyDlg = NULL;
}
CfunApp::~CfunApp()
{
}
// 唯一的一个 CfunApp 对象
CfunApp theApp;
// CfunApp 初始化
BOOL CfunApp::InitInstance()
{
CWinApp::InitInstance();
g_hInst = this->m_hInstance;
if ( !m_pMyDlg )
{
m_pMyDlg = new CMyDlg;
if ( !m_pMyDlg->GetSafeHwnd() )
m_pMyDlg->Create(IDD_MYDLG);
}
return TRUE;
}
int CfunApp::ExitInstance()
{
if ( m_pMyDlg )
delete m_pMyDlg;
return CWinApp::ExitInstance();
}
DLLEXPORT BOOL WINAPI InstallHook(BOOL bEnable, int iCount, DWORD dwThreadId)
{
BOOL bRet = FALSE;
if ( iCount >= 20 ) return FALSE;
if ( bEnable && !hKeyHook[iCount] )
{
g_hKeyHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_hInst, dwThreadId);
hKeyHook[iCount] = g_hKeyHook;
bRet = ( g_hKeyHook != NULL );
}
else if ( !bEnable && hKeyHook[iCount] )
{
bRet = UnhookWindowsHookEx(hKeyHook[iCount]);
hKeyHook[iCount] = NULL;
}
return bRet;
}
HWND WINAPI GetGameWnd()
{
HMODULE hMod = ::GetModuleHandle(_T("ql.dll"));
if ( hMod )
{
FARPROC f = ::GetProcAddress(hMod, "g_hGameWindow");
if ( f )
return (HWND)ULongToPtr(*(PDWORD)f);
}
return NULL;
}
//short int iShiftKeyState;
//short int iCtrlKeyState;
//short int iAltKeyState;
const int iKeyPressMask = 0x80000000;
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if ( (nCode == HC_ACTION) && (((DWORD)lParam & iKeyPressMask) == 0) )
{
// iCtrlKeyState = GetKeyState(VK_CONTROL);
// iShiftKeyState = GetKeyState(VK_SHIFT);
// iAltKeyState = GetKeyState(VK_MENU);
// if ( (iCtrlKeyState & iKeyPressMask) == iKeyPressMask )
// {
// switch ( wParam )
// {
// case VK_F12:
// if ( theApp.m_pMyDlg )
// {
// if ( theApp.m_pMyDlg->IsWindowVisible() )
// theApp.m_pMyDlg->ShowWindow(SW_HIDE);
// else
// theApp.m_pMyDlg->ShowWindow(SW_SHOW);
// }
// Beep(1000, 100);
// break;
// }
// }
switch ( wParam )
{
case VK_F12:
if ( !g_hGameWindow ) g_hGameWindow = GetGameWnd();
if ( (g_bOK = EnableDialog()) )
{
if ( theApp.m_pMyDlg )
{
if ( theApp.m_pMyDlg->IsWindowVisible() )
theApp.m_pMyDlg->ShowWindow(SW_HIDE);
else
theApp.m_pMyDlg->ShowWindow(SW_SHOW);
Beep(1000, 100);
}
}
break;
}
}
return CallNextHookEx(g_hKeyHook, nCode, wParam, lParam);
}