MouseHook.dll
MouseHook.h
#pragma once /*global*/ extern DWORD g_dwThreadId; extern HINSTANCE g_Hinstance; extern HHOOK g_MouseHook; extern POINT g_ptOld; /*define*/ #define WM_MOUSEMOVE_ALL WM_USER+1000 /*export*/ extern "C" __declspec(dllexport) BOOL SetHook(DWORD dwThreadId); LRESULT CALLBACK MouseProc( __in int nCode, __in WPARAM wParam, __in LPARAM lParam );
MouseHook.cpp
#include "stdafx.h" #include "MouseHook.h" #pragma data_seg("GlobalData") DWORD g_dwThreadId = 0; #pragma data_seg() #pragma comment(linker, "/SECTION:GlobalData,RWS") HINSTANCE g_Hinstance = NULL; HHOOK g_MouseHook = NULL; POINT g_ptOld; BOOL SetHook(DWORD dwThreadId) { if ( dwThreadId <= 0 ) return FALSE; g_MouseHook = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseProc, g_Hinstance, 0); if ( NULL == g_MouseHook ) return FALSE; g_dwThreadId = dwThreadId; return TRUE; } LRESULT CALLBACK MouseProc( __in int nCode, __in WPARAM wParam, __in LPARAM lParam ) { LRESULT lResult = ::CallNextHookEx(g_MouseHook, nCode, wParam, lParam); if ( g_dwThreadId > 0 ) { POINT pt; ::GetCursorPos(&pt); if ( pt.x != g_ptOld.x && pt.y != g_ptOld.y ) { ::PostThreadMessage(g_dwThreadId, WM_MOUSEMOVE_ALL, 0, MAKELPARAM(pt.x, pt.y)); g_ptOld.x = pt.x; g_ptOld.y = pt.y; } } return lResult; }
dllmain.cpp
#include "stdafx.h" #include "MouseHook.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { g_Hinstance = (HINSTANCE)hModule; g_ptOld.x = 0; g_ptOld.y = 0; return TRUE; }
HangWnd
HangWnd.cpp(App)
BOOL CHangWndApp::InitInstance() { // InitCommonControlsEx() is required on Windows XP if an application // manifest specifies use of ComCtl32.dll version 6 or later to enable // visual styles. Otherwise, any window creation will fail. INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); // Set this to include all the common control classes you want to use // in your application. InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp::InitInstance(); AfxEnableControlContainer(); HMODULE hModule = ::LoadLibrary(_T("../Debug/MouseHook.dll")); if ( NULL == hModule ) return FALSE; typedef BOOL (*SETHOOK)(DWORD dwThreadId); SETHOOK SetHook = (SETHOOK)::GetProcAddress(hModule, "SetHook"); if ( SetHook ) { DWORD dwThreadId = ::GetCurrentThreadId(); SetHook(dwThreadId); } CHangWndDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); ::FreeLibrary(hModule); hModule = NULL; // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; }
HangWndDlg.h
class CHangWndDlg : public CDialogEx { // Construction public: CHangWndDlg(CWnd* pParent = NULL); // standard constructor private: BOOL m_bIsWindowVisible; };
HangWndDlg.cpp
#define WM_MOUSEMOVE_ALL WM_USER+1000
CHangWndDlg::CHangWndDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CHangWndDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_bIsWindowVisible = TRUE; } BOOL CHangWndDlg::PreTranslateMessage(MSG* pMsg) { if ( pMsg->message == WM_MOUSEMOVE_ALL ) { POINT pt; pt.x = LOWORD(pMsg->lParam); pt.y = HIWORD(pMsg->lParam); CRect rcWnd; GetWindowRect(&rcWnd); int nWidth = rcWnd.Width(); int nHeight = rcWnd.Height(); if ( rcWnd.left <= 20 ) { if ( m_bIsWindowVisible ) { BOOL bPtInRect = rcWnd.PtInRect(pt); if ( !bPtInRect ) { for ( int i = 0; i < nWidth; i++ ) { SetWindowPos(&CWnd::wndNoTopMost, 0, rcWnd.top, nWidth-i, nHeight, SWP_SHOWWINDOW); } SetWindowPos(&CWnd::wndNoTopMost, 0, rcWnd.top, nWidth, nHeight, SWP_HIDEWINDOW); m_bIsWindowVisible = FALSE; } } } if ( !m_bIsWindowVisible && pt.x < 10 ) { for ( int i = 0; i < nWidth; i++ ) { SetWindowPos(&CWnd::wndNoTopMost, 0, rcWnd.top, 0+i, nHeight, SWP_SHOWWINDOW); } m_bIsWindowVisible = TRUE; } } return CDialogEx::PreTranslateMessage(pMsg); }