⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hook.cpp

📁 protel99se鼠标增强软件
💻 CPP
字号:
// Hook.cpp : Defines the initialization routines for the DLL.
//

#include "stdafx.h"
#include "Hook.h"
#include "winuser.h"
#include <tlhelp32.h>
#define  DllExport _declspec(dllexport)    

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#pragma data_seg(".SHARDAT")
static HHOOK hkb = NULL;
#pragma data_seg()
HINSTANCE hins;
static	POINT	CurPosPre={0,0};
static	BOOL	rbtnDown = FALSE;
static	BOOL	rbtnMove = FALSE;
static	BOOL	mbtnDown = FALSE;
static	BOOL	mbtnMove = FALSE;


//
//	Note!
//
//		If this DLL is dynamically linked against the MFC
//		DLLs, any functions exported from this DLL which
//		call into MFC must have the AFX_MANAGE_STATE macro
//		added at the very beginning of the function.
//
//		For example:
//
//		extern "C" BOOL PASCAL EXPORT ExportedFunction()
//		{
//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
//			// normal function body here
//		}
//
//		It is very important that this macro appear in each
//		function, prior to any calls into MFC.  This means that
//		it must appear as the first statement within the 
//		function, even before any object variable declarations
//		as their constructors may generate calls into the MFC
//		DLL.
//
//		Please see MFC Technical Notes 33 and 58 for additional
//		details.
//

/////////////////////////////////////////////////////////////////////////////
// CHookApp

BEGIN_MESSAGE_MAP(CHookApp, CWinApp)
	//{{AFX_MSG_MAP(CHookApp)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHookApp construction

CHookApp::CHookApp()
{
	// TODO: add construction code here,
	// Place all significant initialization in InitInstance
}

/////////////////////////////////////////////////////////////////////////////
// The one and only CHookApp object

CHookApp theApp;

BOOL CheckProcess(char	*szProcessNameCurrent)
{
	DWORD	pid;
	HANDLE	hProcess;
	char	szProcessName[256];

	HWND hWnd = GetForegroundWindow();

	GetWindowThreadProcessId(hWnd, &pid);
	hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
	if (NULL != hProcess )
	{
		HMODULE hMod;
		DWORD cbNeeded;
		typedef DWORD (CALLBACK * GetModuleBaseName)(
							HANDLE hProcess,    // handle to the process
							HMODULE hModule,    // handle to module to find filename for
							LPTSTR lpFilename,  // pointer to buffer to receive module path
							DWORD nSize         // size of buffer, in characters
							);
		typedef BOOL (CALLBACK *EnumProcessModules)(
							HANDLE hProcess,      // handle to the process
							HMODULE * lphModule,  // array to receive the module handles
							DWORD cb,             // size of the array
							LPDWORD lpcbNeeded    // receives the number of bytes returned
							);//定义回调函数的地址 

		HINSTANCE hPsDll = LoadLibrary("PSAPI.DLL");
		GetModuleBaseName pGetModuleBaseName =
				(GetModuleBaseName)GetProcAddress(hPsDll, "GetModuleBaseNameA");
		EnumProcessModules pEnumProcessModules =
				(EnumProcessModules)GetProcAddress(hPsDll, "EnumProcessModules");
		if ( pEnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
		{
			if(pGetModuleBaseName( hProcess, hMod, szProcessName, 
							   sizeof(szProcessName)/sizeof(TCHAR)))
			{
				_strlwr(szProcessName);
				if(strstr(szProcessName, szProcessNameCurrent))
				{
					return TRUE;
				}
			}
		}
	}
	return FALSE;
}

LRESULT DllExport   CALLBACK LowLevelMouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
	CString	str;

	if(nCode == HC_ACTION)
	{
		PMSLLHOOKSTRUCT pMSLLHook = (PMSLLHOOKSTRUCT)lParam;
		if(wParam == WM_MOUSEMOVE)
		{
			if(!CheckProcess("powerpcb"))
			{
				return CallNextHookEx(hkb, nCode, wParam, lParam );
			}
			if(rbtnDown)
			{
				POINT	pt;
				HWND hWnd;
				GetCursorPos(&pt);
				hWnd = WindowFromPoint(pt);
				if(abs(pMSLLHook->pt.x - CurPosPre.x)>32)
				{

					PostMessage(hWnd, WM_KEYDOWN, VK_SHIFT, 0);
					PostMessage(hWnd, 
								WM_MOUSEWHEEL,
								((pMSLLHook->pt.x - CurPosPre.x)<<16|MK_SHIFT),
								((pMSLLHook->pt.y << 16) + pMSLLHook->pt.x));
					PostMessage(hWnd, WM_KEYUP, VK_SHIFT, 0);
					CurPosPre.x = pMSLLHook->pt.x;
					rbtnMove = TRUE;
				}
				if(abs(pMSLLHook->pt.y - CurPosPre.y)>32)
				{
					PostMessage(hWnd, WM_KEYDOWN, VK_MENU, 0);
					PostMessage(hWnd, 
								WM_MOUSEWHEEL,
								((pMSLLHook->pt.y - CurPosPre.y)<<16),
								((pMSLLHook->pt.y << 16) + pMSLLHook->pt.x));
					PostMessage(hWnd, WM_KEYUP, VK_MENU, 0);
					CurPosPre.y = pMSLLHook->pt.y;
					rbtnMove = TRUE;
				}

				return CallNextHookEx(hkb, nCode, wParam, lParam );
			}
			else if(mbtnDown)
			{
				mbtnMove = TRUE;
			}
				
			return CallNextHookEx(hkb, nCode, wParam, lParam );
		}
		{
			HWND hWnd = GetForegroundWindow();
			if(wParam == WM_MOUSEWHEEL)
			{
				TRACE("WHELL Action !\n");
				str.Format("MouseData is 0x%x", (short)HIWORD(pMSLLHook->mouseData));
				TRACE(str);
				if((!CheckProcess("client99se"))
					&& (!CheckProcess("dxp"))
					&& (!CheckProcess("powerpcb"))
					&& (!CheckProcess("capture")))
				{
					return CallNextHookEx(hkb, nCode, wParam, lParam );
				}
				if(CheckProcess("capture"))
				{
					if((short)HIWORD(pMSLLHook->mouseData) > 0)
					{
						PostMessage(hWnd, WM_KEYDOWN, 'I', 0);
						PostMessage(hWnd, WM_KEYUP, 'I', 0);
						return TRUE;
					}
					else
					{
						PostMessage(hWnd, WM_KEYDOWN, 'O', 0);
						PostMessage(hWnd, WM_KEYUP, 'O', 0);
						return TRUE;
					}
				}
				else
				{
					if((short)HIWORD(pMSLLHook->mouseData) > 0)
					{
						PostMessage(hWnd, WM_KEYDOWN, 0x21, 0);
					}
					else
					{
						PostMessage(hWnd, WM_KEYDOWN, 0x22, 0);
					}
				}
			}
			else if(wParam == WM_MBUTTONDOWN)
			{
				if(CheckProcess("powerpcb"))
				{
					mbtnMove = FALSE;
					mbtnDown = TRUE;
				}
				if((!CheckProcess("client99se")) && (!CheckProcess("dxp")))
				{
					return CallNextHookEx(hkb, nCode, wParam, lParam );
				}
				PostMessage(hWnd, WM_KEYDOWN, 106, 0);
				PostMessage(hWnd, WM_KEYUP, 106, 0);
				PostMessage(hWnd, WM_KEYDOWN, VK_END, 0);
			}
			else if(wParam == WM_MBUTTONUP)
			{
				if(CheckProcess("powerpcb"))
				{
					mbtnDown = FALSE;
					if(mbtnMove)
					{
						return CallNextHookEx(hkb, nCode, wParam, lParam );
					}
					PostMessage(hWnd, WM_KEYDOWN, VK_F4, 0);
					PostMessage(hWnd, WM_KEYUP, VK_F4, 0);
				}
			}
			else if(wParam == WM_RBUTTONDOWN)
			{
				if(CheckProcess("powerpcb"))
				{
					rbtnDown = TRUE;
					CurPosPre = pMSLLHook->pt;
					return TRUE;
				}
				if((!CheckProcess("client99se")) && (!CheckProcess("dxp")))
				{
					return CallNextHookEx(hkb, nCode, wParam, lParam );
				}
				if(GetAsyncKeyState(VK_LBUTTON) & 0x8000)
				{
					PostMessage(hWnd, WM_KEYDOWN, ' ', 0);
					return TRUE;
				}
			}
			else if(wParam == WM_RBUTTONUP)
			{
				rbtnDown = FALSE;
				if(CheckProcess("powerpcb"))
				{
					if(rbtnMove)
					{
						rbtnMove = FALSE;
						return CallNextHookEx(hkb, nCode, wParam, lParam );
					}

					POINT	p;
					GetCursorPos(&p);
					hWnd = WindowFromPoint(p);

					ScreenToClient(hWnd, &p);
					lParam = MAKELPARAM(p.x, p.y);
					PostMessage(hWnd, WM_RBUTTONDOWN, MK_LBUTTON, lParam);
					return CallNextHookEx(hkb, nCode, wParam, lParam );
				}
				if((!CheckProcess("client99se")) && (!CheckProcess("dxp")))
				{
					return CallNextHookEx(hkb, nCode, wParam, lParam );
				}
				if(GetAsyncKeyState(VK_LBUTTON))
				{
//					PostMessage(hWnd, WM_KEYDOWN, ' ', 0);
					return TRUE;
				}
			}
		}
	}

	return CallNextHookEx(hkb, nCode, wParam, lParam );	
}


BOOL DllExport  installhook()
{
	hkb = SetWindowsHookEx(14,(HOOKPROC)LowLevelMouseProc,hins,0);
	return TRUE;
}

BOOL DllExport  UnHook()
{   	
	BOOL unhooked = UnhookWindowsHookEx(hkb);
	return unhooked;
}

BOOL CHookApp::InitInstance() 
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	hins=AfxGetInstanceHandle();
	
	return CWinApp::InitInstance();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -