钩子问题,请帮我看看这块代码。(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);

}
...全文
43 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xiaogengcn 2004-04-13
给你一小段示例代码,自己改装吧!
if(g_hLogHook==NULL)
//安装日志钩子
g_hLogHook=SetWindowsHookEx(WH_JOURNALRECORD,
(HOOKPROC) JournalLogProc,HInstance,0);
MSG msg;
while(1)
{
while(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
GetMessage(&msg,NULL,0,0);
if(msg.message==WM_CANCELJOURNAL)
{
if(g_hLogHook=SetWindowsHookEx(WH_JOURNALRECORD,
(HOOKPROC)
JournalLogProc,HInstance,0) == NULL)
ShowMessage("SetWindowsHookEx error");
}
else
DispatchMessage(&msg);
}
Sleep(10);
}
if(g_hLogHook)
UnhookWindowsHookEx(g_hLogHook);
回复
axb99 2004-04-03
没解决,自己顶一下
回复
axb99 2004-04-02
那要怎么做,是不是还要收到WM_CANCELJOURNAL 后处理一下?再SetWindowsHookEx ?
还有没有更好的方法,别的钩子类型可以做不?,望指条明路,讲过好的办法。
回复
jenemery 2004-04-01
up
回复
xiaogengcn 2004-04-01
如果你希望自己安装的WH_JOURNALRECORD钩子在按下CTRL+ESC或CTRL+ALT+DEL后仍然起作用,可以考虑在接管一下按下CTRL+ESC或CTRL+ALT+DEL后处理过程。
回复
xiaogengcn 2004-04-01
这是由于你安装的钩子类型WH_JOURNALRECORD决定的,你可以看下面这段关于JournalRecordProc 帮助:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This role as a signal to stop journal recording means that a CTRL+BREAK key combination cannot itself be recorded. Since the CTRL+C key combination has no such role as a journaling signal, it can be recorded. There are two other key combinations that cannot be recorded: CTRL+ESC and CTRL+ALT+DEL. Those two key combinations cause the system to stop all journaling activities (record or playback), remove all journaling hooks, and post a WM_CANCELJOURNAL message to the journaling application.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
回复
axb99 2004-04-01
没法解决,自己顶一下
回复
shadowstar 2004-03-31
我以前也遇到过类似的情况,但是因为我没把HOOK放到DLL里实现
回复
相关推荐
发帖
VCL组件使用和开发
创建于2007-08-02

587

社区成员

C++ Builder VCL组件使用和开发
申请成为版主
帖子事件
创建了帖子
2004-03-31 08:03
社区公告
暂无公告