//---------------------------------------------------------------------------
#include <vcl.h>
//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include <stdio.h>
#include "Unit_Modal.h"
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------- -----------------
typedef struct _MyHookStruct
{
HHOOK hHook;
HWND hDisplayWnd;
HWND hEditWnd;
}MyHookStruct;
MyHookStruct *g_HookStruct = NULL;
//---------------------------------------------------------------------------
HINSTANCE ghInst;
HANDLE hS = NULL;
LPVOID lpBufferS;
//-------------------------------------
#define WM_MYMESSAGE WM_USER + 1
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) void __stdcall SetHook1(HWND hWnd,const unsigned long ulFlag);
extern "C" __declspec(dllexport) void __stdcall RemoveHook(void);
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
ghInst = hinst;
switch(reason){
case DLL_PROCESS_ATTACH: //构造函数
hS = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,0x100,"hS");
lpBufferS = MapViewOfFile(hS,FILE_MAP_ALL_ACCESS,0,0,0);
g_HookStruct = (MyHookStruct*)lpBufferS;
break;
case DLL_PROCESS_DETACH: //析构函数
UnmapViewOfFile(lpBufferS);
CloseHandle(hS);
break;
}
return 1;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK Mouse_MOVE(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook = (MOUSEHOOKSTRUCT FAR *)lParam;
if(nCode == HC_ACTION){
if(wParam == WM_MOUSEMOVE || wParam == WM_NCMOUSEMOVE){
if(g_HookStruct->hHook != NULL){
PostMessage(g_HookStruct->hDisplayWnd,WM_MYMESSAGE,(int)pMouseHook->pt.x,(int)pMouseHook->pt.y);
}
}
}
return CallNextHookEx(g_HookStruct->hHook,nCode,wParam,lParam);
}
LRESULT CALLBACK Mouse_CLICK(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook = (MOUSEHOOKSTRUCT FAR *)lParam;
if(nCode == HC_ACTION){
if(wParam == WM_LBUTTONDOWN ||
wParam == WM_LBUTTONUP ||
wParam == WM_LBUTTONDBLCLK ||
wParam == WM_RBUTTONDOWN ||
wParam == WM_RBUTTONUP ||
wParam == WM_RBUTTONDBLCLK ||
wParam == WM_MBUTTONDOWN ||
wParam == WM_MBUTTONUP ||
wParam == WM_MBUTTONDBLCLK){
if(g_HookStruct->hHook != NULL){
PostMessage(g_HookStruct->hDisplayWnd,WM_MYMESSAGE,(int)pMouseHook->pt.x,(int)pMouseHook->pt.y);
}
}
}
return CallNextHookEx(g_HookStruct->hHook,nCode,wParam,lParam);
}
int f_asc_dec(const int aiASC)
{
if(aiASC >= 48 && aiASC <= 58) return aiASC - 48;
if(aiASC >= 65 && aiASC <= 70) return aiASC - 55;
if(aiASC >= 97 && aiASC <= 102)return aiASC - 87;
return 0;
}
//取unsigned long的第几位到第几位值。
unsigned long f_DecodeuLong(const unsigned long iNum,const int iStart,const int iEnd)
{
char cTemp[128];
itoa(iNum,cTemp,2);
int iLength = strlen(cTemp);
unsigned long iResult = 0;
int iStart2,iEnd2;
iStart2 = iStart;
iEnd2 = iEnd;
if(iEnd2 >= iStart){//
if(iEnd2 >= iLength){
iEnd2 = iLength - 1;//当结束大于等长度时,以最后一个数为结束。
}
if(iStart2 < iLength){
int iAdd = 1;
for(int i=iLength - iStart2 - 1;i>=iLength - iEnd2 - 1;i--){//递减
if(i == iLength - iStart2 - 1){
iResult = f_asc_dec(cTemp[i]);
}
else{
iAdd *= 2;
iResult += f_asc_dec(cTemp[i]) * iAdd;
}
}
}
else{
iResult = 0;//开始大于等于长度
}
}
else{
iResult = 0;//开始,结束非法
}
return iResult;
}
//---------------------------------------------------------------------------
__declspec(dllexport) void __stdcall SetHook1(HWND hWnd,const unsigned long ulFlag)
{
g_HookStruct->hDisplayWnd = hWnd;
unsigned long ulRes = f_DecodeuLong(ulFlag,0,3);
if(ulRes == 0){//wParam == WM_MOUSEMOVE || wParam == WM_NCMOUSEMOVE
g_HookStruct->hHook = ::SetWindowsHookEx(WH_MOUSE,(HOOKPROC)Mouse_MOVE,ghInst,NULL);
}
else if(ulRes == 1){
g_HookStruct->hHook = ::SetWindowsHookEx(WH_MOUSE,(HOOKPROC)Mouse_CLICK,ghInst,NULL);
}
//Application->ProcessMessages();
hParentHandle = g_HookStruct->hDisplayWnd;
for_Modal = new Tfor_Modal(Application);//一定要加上这一句。如果没有这一句,鼠标不在窗体内时无法启动HOOK。
for_Modal->ShowModal();
if(g_HookStruct->hHook == NULL){
//MessageBox(NULL,"Sorry! 无法挂上Hook","Hook DLL",MB_OK);
}
}
//---------------------------------------------------------------------------
__declspec(dllexport) void __stdcall RemoveHook(void)
{
UnhookWindowsHookEx(g_HookStruct->hHook);
}
//---------------------------------------------------------------------------
/*//---------------------------------------------------------------------------
#include <vcl.h>
//---------------------------------------------------------------------------
#include <vcl.h> //原有头文件
#include <windows.h> //原有头文件
#include <stdio.h> //加入C++字符串头文件
#include "sharedunit.h"
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------- -----------------
typedef struct _MyHookStruct
{
HHOOK hHook;
int nLoadCount; // DLL装入次数计数
HWND hDisplayWnd;
}MyHookStruct;
MyHookStruct *g_HookStruct = NULL;
//---------------------------------------------------------------------------
//DLL的固定声明
//HHOOK hHook;//挂上的hook handle
HINSTANCE ghInst;//连接文件的模块handle,固定进程
//HWND hAppWnd;//执行此dll的特定exe程序handle__"TMouseHookForm"
//-------------------------------------
HANDLE hHook = NULL;
LPVOID lpBufferHook;
//HANDLE hHook = NULL;
//LPVOID pazHookBuf;
//-------------------------------------
HANDLE hDisplay = NULL;
LPVOID lpBufferDisplay;
HANDLE hS = NULL;
LPVOID lpBufferS;
//-------------------------------------
#define WM_MYMESSAGE WM_USER + 100
//---------------------------------------------------------------------------
//符合以C语言编译的DLL输出函数
extern "C" __declspec(dllexport) void __stdcall SetHook2(HWND hWnd);
extern "C" __declspec(dllexport) void __stdcall RemoveHook(void);
//---------------------------------------------------------------------------
//DLL的构造函数与析构函数
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
ghInst = hinst;
//当此DLL被调用或结束
switch(reason){
case DLL_PROCESS_ATTACH: //此DLL的构造函数
hHook = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,0x100,"Hook");
lpBufferHook = MapViewOfFile(hHook,FILE_MAP_ALL_ACCESS,0,0,0);
hDisplay = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,0x100,"App");
lpBufferDisplay = MapViewOfFile(hDisplay,FILE_MAP_ALL_ACCESS,0,0,0);
hS = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,0x100,"hS");
lpBufferS = MapViewOfFile(hS,FILE_MAP_ALL_ACCESS,0,0,0);
g_HookStruct = (MyHookStruct*)lpBufferS;
break;
case DLL_PROCESS_DETACH: //此DLL析构函数
UnmapViewOfFile(lpBufferHook);//完成从进程的地址空间撤消文件数据的映像
CloseHandle(hHook);
UnmapViewOfFile(lpBufferDisplay);
CloseHand
评论0
最新资源