代码如下:
#pragma data_seg("Shared")
HHOOK g_lhHook=NULL;
HINSTANCE g_lhInstance=NULL;
#pragma data_seg()
#pragma comment(linker,"/SECTION:Shared,RWS")extern "C" __declspec (dllexport) BOOL HookStart();
extern "C" __declspec (dllexport) BOOL HookStop();BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
//如果使用lpReserved参数则删除下面这行
UNREFERENCED_PARAMETER(lpReserved); switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH://在DLL加载时对全局变量赋值
g_lhInstance = (HINSTANCE)hModule;
break;
case DLL_PROCESS_DETACH:
g_lhInstance = NULL;
break;
default:
break;
} return TRUE;
}//钩子的过滤函数
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook=NULL; pMouseHook=(MOUSEHOOKSTRUCT FAR *)lParam; return::CallNextHookEx(g_lhHook,nCode,wParam,lParam);
}//安装钩子
BOOL HookStart()
{
HWND hWnd = NULL;
DWORD dwThreadId = 0; hWnd = FindWindow(NULL,"Test");
dwThreadId = GetWindowThreadProcessId(hWnd,NULL); g_lhHook = SetWindowsHookEx(WH_MOUSE,
MouseProc,
g_lhInstance,
dwThreadId
);
return (g_lhHook!=NULL);
}//卸载钩子
BOOL HookStop()
{
BOOL ret; if(g_lhHook!=NULL)
{
ret=::UnhookWindowsHookEx(g_lhHook);
g_lhHook=NULL;
} return ret;
}
安装钩子的函数HookStart()已经被EXE文件成功调用?可回调函数里没任何消息可以捕捉到,哪儿错了呢?谢谢高手指点.
#pragma data_seg("Shared")
HHOOK g_lhHook=NULL;
HINSTANCE g_lhInstance=NULL;
#pragma data_seg()
#pragma comment(linker,"/SECTION:Shared,RWS")extern "C" __declspec (dllexport) BOOL HookStart();
extern "C" __declspec (dllexport) BOOL HookStop();BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
//如果使用lpReserved参数则删除下面这行
UNREFERENCED_PARAMETER(lpReserved); switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH://在DLL加载时对全局变量赋值
g_lhInstance = (HINSTANCE)hModule;
break;
case DLL_PROCESS_DETACH:
g_lhInstance = NULL;
break;
default:
break;
} return TRUE;
}//钩子的过滤函数
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook=NULL; pMouseHook=(MOUSEHOOKSTRUCT FAR *)lParam; return::CallNextHookEx(g_lhHook,nCode,wParam,lParam);
}//安装钩子
BOOL HookStart()
{
HWND hWnd = NULL;
DWORD dwThreadId = 0; hWnd = FindWindow(NULL,"Test");
dwThreadId = GetWindowThreadProcessId(hWnd,NULL); g_lhHook = SetWindowsHookEx(WH_MOUSE,
MouseProc,
g_lhInstance,
dwThreadId
);
return (g_lhHook!=NULL);
}//卸载钩子
BOOL HookStop()
{
BOOL ret; if(g_lhHook!=NULL)
{
ret=::UnhookWindowsHookEx(g_lhHook);
g_lhHook=NULL;
} return ret;
}
安装钩子的函数HookStart()已经被EXE文件成功调用?可回调函数里没任何消息可以捕捉到,哪儿错了呢?谢谢高手指点.
解决方案 »
- First-chance exception in test.exe (KERNELBASE.DLL): 0xE06D7363: Microsoft C++ E
- 字符串移动
- GetDeviceCaps 中 SCALINGFACTORX, SCALINGFACTORY 的用法, (老袁能否帮看一下)
- 请问我的这个开发思路应该选用那哪一种软件来做二次开发?用VC++6.0合适吗
- 有关定时播放的问题,请指点
- 谁能给我推荐一个好的电磁场数值计算的网址或高手,不甚感激!!!
- 高分请教如何将一个纯DOS程序的输入和输出重定向到一个WIN窗口中
- 所有可用分全给了,各位请帮帮我关于带checkboxCTreeCtr问题!
- VC每个工程中的StdAfx.h和.cpp文件实干什么用的?
- 为什么无法列出网络资源
- Tab Control的问题,急,在线等!
- vc6.0做win32 dll 时遇到的莫名奇妙,帮忙啊。
注入的方法搜索一下,很多人问过的。
1 首先定义一个DLL,就是上面贴的代码;
2 创建一个进程,在该进程内调用DLL的导出函数HookStart(),安装钩子;
3 被钩的另一个进程为C,其主线程的ID已经在DLL中获得:
hWnd = FindWindow(NULL,"Test");
dwThreadId = GetWindowThreadProcessId(hWnd,NULL);
并传给了SetWindowsHookEx()这个函数,这样的方法正确嘛?看了一下WINDOWS核心编程,好像就是这样说的,还有http://community.csdn.net/Expert/topic/3507/3507600.xml?temp=.7010157这个帖子也是这样说的,可以说就是它的翻版.老大,是我理解错了,还是你们????
LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
LPMOUSEHOOKSTRUCT pMouseHook=NULL; if (nCode == HC_ACTION && wParam == WM_LBUTTONDOWN)
{
AfxMessageBox("aaa");
}
pMouseHook=(MOUSEHOOKSTRUCT FAR *)lParam; return::CallNextHookEx(g_hMouseHook,nCode,wParam,lParam);
}BOOL _declspec(dllexport) InstallMouseHook()
{
if(g_fIsInstalled) return FALSE;
HWND hWnd = ::FindWindowEx(NULL, NULL,"Notepad", NULL);
DWORD id = GetWindowThreadProcessId(hWnd, NULL);
g_hMouseHook = ::SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc, g_hInstances, id);
if(g_hMouseHook==NULL)
AfxMessageBox("安装钩子错误!",MB_OK,0);
g_fIsInstalled = TRUE;
return TRUE;
}
HWND hWnd = NULL;
DWORD dwThreadId = 0; hWnd = FindWindow(NULL,"TEST");
dwThreadId = GetWindowThreadProcessId(hWnd,NULL); g_lhHook = SetWindowsHookEx(WH_MOUSE,
MouseProc,
g_lhInstance,
dwThreadId
);
return (g_lhHook!=NULL);
也成功了,我想钩着TEST的鼠标消息,请问还要做其他工作嘛?非常谢谢你,分不够可以再加啊.:):)
我帮你看看Notepad是系统的记事本程序的类名
拦截别的程序消息的钩子,除了是全局的可以直接调试以外,其他的好象不能直接调试。被调试的程序应该是由IDE环境加载的才能完全由IDE来控制,Test程序是你单独开启的进程,IDE无法得到这个进程里的信息或消息,所以无法调试(这只是个人认为,如果哪位高手能直接调试,告诉一下方法)