钩子问题,请帮我看看这块代码。(100分)
axb99 2004-03-31 08:03:30 这是我写的钩子程序,目的是让一些特定的程序不能运行。我是看了www.ccrun.com/上的一篇文章做出来的。(再次谢谢那位无私的高手!!!:)。现有一个问题,程序运行后可以起作用,能达到目的,但是,一旦按一次Ctrl+Alt+del,不点结束任务,直接取消,或结束了别的程序,我的钩子程序就没作用了。搞不明白这是什么回事,已经试了多种方法,请各位帮忙。
下面的代码我是放在.dll里面的。
//----------
extern "C" __declspec(dllexport) void sethook();
extern "C" __declspec(dllexport) void quithook();
LRESULT CALLBACK JournalLogProc(int iCode, WPARAM wParam, LPARAM lParam);
//static LRESULT CALLBACK JournalLogProc(int iCode,WPARAM wParam,LPARAM lParam);
//钩子变量
HHOOK g_hLogHook=NULL;
//记录上一次得到焦点的窗口句柄
//HWND g_hLastFocus=NULL;
//---------------------------------------
LRESULT CALLBACK JournalLogProc(int iCode,WPARAM wParam,LPARAM lParam)
{
if(iCode<0)
return CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
//EVENTMSG* pEvt=(EVENTMSG*)lParam;
if(iCode==HC_ACTION)
{ int i;
HWND hFocus;//保存当前活动窗口句柄
char szTitle[256];//当前窗口名称
char szWinClass[256];
char szTime[128];//当前的日期和时间
char ch;
char str[10];
AnsiString sClass="CabinetWClass";
hFocus=GetActiveWindow();
GetWindowText(hFocus,szTitle,256);
GetClassName(hFocus,szWinClass,256);
TBinFile f;
f.FileName = TRelPath().Extension("cfg"); //与 .exe 同名的 .cfg 文件
f.OpenMode = TBinFile::omRead; //准备读文件
if(f.Exists) //如果文件存在
{
try
{
f.Active = true; //打开文件
char aLine[2048];
while(fgets(aLine,2000,f)) //读一行文本 (标准 C 函数)
{
if(strnicmp(aLine,"CLASS=",6)==0) //用类名识别
{
TBinFileFuncs::DeleteSpaces(aLine+6,1,1); //去除空格
if(stricmp(aLine+6,szWinClass)==0)
{
PostMessage(hFocus, WM_CLOSE, 0, 0); //关闭程序
// return false;
}
}
else if(strnicmp(aLine,"CAPTION=",8)==0) //用标题识别
{
TBinFileFuncs::DeleteSpaces(aLine+8,1,1); //去除空格
if(stricmp(aLine+8,szTitle)==0)
{
PostMessage(hFocus, WM_CLOSE, 0, 0); //关闭程序
// return false;
}
}
}
}
catch(Exception &e)
{
//忽略错误提示,
}
}
}
return CallNextHookEx(g_hLogHook,iCode,wParam,lParam);
}
//--------------------
extern "C" __declspec(dllexport) void sethook()
{
if(g_hLogHook==NULL)
//安装日志钩子
g_hLogHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalLogProc,HInstance,0);
}