www.pudn.com > saolei.rar > MouseDll.cpp
// MouseDll.cpp : Defines the initialization routines for the DLL. // #include "stdafx.h" #include#include "MouseHook.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #pragma data_seg(".myData") HHOOK glhMouseHook = NULL; //安装的鼠标勾子句柄 HHOOK glhKeyBoardHook = NULL; //安装键盘勾子句柄 HINSTANCE glhInstance = NULL; //DLL实例句柄 HWND glMainWin = NULL; TCHAR winMineClassName[] = "扫雷"; #pragma data_seg() #pragma comment(linker, "/SECTION:.myData,rws") struct MsgMouse { CPoint pt; int KeyValue; }; LRESULT WINAPI MouseProc(int nCode, WPARAM wParam, LPARAM lParam); LRESULT WINAPI KeyBoardProc(int nCode, WPARAM wParam, LPARAM lParam); static AFX_EXTENSION_MODULE MouseDllDLL = { NULL, NULL }; extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { // Remove this if you use lpReserved UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("MOUSEDLL.DLL Initializing!\n"); // Extension DLL one-time initialization if (!AfxInitExtensionModule(MouseDllDLL, hInstance)) return 0; glhInstance = hInstance; new CDynLinkLibrary(MouseDllDLL); } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("MOUSEDLL.DLL Terminating!\n"); // Terminate the library before destructors are called AfxTermExtensionModule(MouseDllDLL); } return 1; // ok } ////////////////////////////////////////////////////////////////////// // CMouseHook Class ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMouseHook::CMouseHook() { } CMouseHook::~CMouseHook() { StopMouseHook(); StopKeyBoardHook(); } BOOL CMouseHook::StartMouseHook(HWND hwnd) { if (glhMouseHook) return TRUE; BOOL bResult = FALSE; glhMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, glhInstance, 0); if (glhMouseHook != NULL) { glMainWin = hwnd; bResult = TRUE; } return bResult; } BOOL CMouseHook::StopMouseHook() { BOOL bResult = FALSE; if (glhMouseHook) bResult = UnhookWindowsHookEx(glhMouseHook); if (bResult) { glhMouseHook = NULL; glMainWin = NULL; } return bResult; } LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam) { LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *)lParam; HWND hWinMineWnd = ::FindWindow(winMineClassName,NULL); if (nCode < HC_ACTION || hWinMineWnd != pMouseHook->hwnd) return CallNextHookEx(glhMouseHook,nCode,wParam,lParam); if ( GetForegroundWindow() != hWinMineWnd ) return CallNextHookEx(glhMouseHook,nCode,wParam,lParam); if ( wParam == WM_LBUTTONDOWN || wParam == WM_RBUTTONDOWN || wParam == WM_LBUTTONUP || wParam == WM_RBUTTONUP ) { MsgMouse Msg; Msg.pt = pMouseHook->pt; Msg.KeyValue = wParam; COPYDATASTRUCT cs; cs.dwData = 0; cs.cbData = sizeof(MsgMouse); cs.lpData = &Msg; SendMessage(glMainWin, WM_COPYDATA, (WPARAM)pMouseHook->hwnd, (LPARAM)&cs); } return CallNextHookEx(glhMouseHook,nCode,wParam,lParam); } BOOL CMouseHook::StartKeyBoardHook() { BOOL bResult = FALSE; glhKeyBoardHook = SetWindowsHookEx(WH_MOUSE, KeyBoardProc, glhInstance, 0); if (glhKeyBoardHook != NULL) bResult = TRUE; return bResult; } BOOL CMouseHook::StopKeyBoardHook() { BOOL bResult = FALSE; if (glhKeyBoardHook) bResult = UnhookWindowsHookEx(glhKeyBoardHook); if (bResult) glhKeyBoardHook = NULL; return bResult; } LRESULT WINAPI KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam) { return CallNextHookEx(glhKeyBoardHook,nCode,wParam,lParam); }