//---------------------------------------------------------------------------
#include <vcl.h>
#include <windows.h>
#include <stdio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#pragma argsused
HHOOK hook;
HINSTANCE ins;
LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam);
//---------------------------------------------------------------------------
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
if(ins==NULL) ins=hinst;
if(reason==DLL_PROCESS_DETACH)
{UnhookWindowsHookEx(hook);
}
return 1;
}
//---------------------------------------------------------------------------
extern "C" void __export sethook()
{
if (hook==NULL)
{
hook=SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,ins,0);
if (hook==NULL) MessageBox(NULL,"hook fail","message",0);
}
}
//------------------------------------------------------------------------------
LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(nCode<0) return CallNextHookEx(hook,nCode,wParam,lParam);
if(nCode==HCBT_CREATEWND)
{MessageBox(NULL,"WND Created!","Hook!",0);//出错的地方
}
return 0;
}
//--------------------------------------------------------------------------------
为了学习hook写的,帮忙看看错在哪里?
我是想在捕获到系统创建一个窗口时能弹出一个MessageBox,以检测我的hook是不是起到作用了,但是问题很麻烦,MessageBox总是一个接一个的出来。
还有就是,不知道应该怎么调试着样的程序,因为他好象使任何弹出的窗口、菜单都无效了。
LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
全就会不停调用的,HOOK程序就像device程序一样,不能用普通方法调试的,
要检测我的hook是不是起到作用了可用static 变量试试
static bool first=false;
if(nCode==HCBT_CREATEWND)
{
if (!first)
{
MessageBox(NULL,"WND Created!","Hook!",0);
first=true;
}
}
其实你的程序本无错,多个MessageBox就说明HOOK成功了!
不要在HOOK中调用MessageBox等需要用户确认的对话框,会严重影响系统的性能。
可以用文件记录下来,再查看结果。
MessageBox本身就是一个窗口,也会触发CBTProc的,所以会循环弹出。
可以去这里看一看,绝对精彩:
http://www.aslike.net
自己再写一个程序与它通信,或是直接写文件看结果