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