首页
社区
课程
招聘
[求助]钩子函数的问题
发表于: 2010-4-22 21:12 5614

[求助]钩子函数的问题

2010-4-22 21:12
5614
帮看看下边的DLL程序,我只想禁止打开指定的窗口,而不是全部的,但使用下边的程序后,全部的窗口打不开,要怎样改呢?
#include<windows.h>
extern "C"__declspec(dllexport) void sethook(char *s);//s指要禁止打开的窗口名字
extern "C"__declspec(dllexport) void stophook();

HHOOK hook=NULL;
char title[255];

LRESULT CALLBACK CBTproc(int nCode,WPARAM wparam,LPARAM lparam)
{
if(nCode<0)
return CallNextHookEx(hook,nCode,wparam,lparam);
if(nCode==HCBT_CREATEWND)
{
HWND hwnd;
char _title[255];
hwnd=(HWND)wparam;
GetWindowText(hwnd,_title,sizeof(_title));
if(strcmp(title,_title)==0)
{
MessageBox(NULL,"不能打开该应用程序!","错误",0);
return 1;
}
return CallNextHookEx(hook,nCode,wparam,lparam);
}
return CallNextHookEx(hook,nCode,wparam,lparam);
}

void sethook(char *s)
{
if(strlen(s)==0)
return;
else
{
strcpy(title,s);
if(hook==NULL)
hook=SetWindowsHookEx(WH_CBT,CBTproc,GetModuleHandle("STOPCREATE.dll"),0);
}
}

void stophook()
{
if(hook!=NULL)
UnhookWindowsHookEx(hook);
hook=NULL;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
2
如果要想打开其他应用程序的窗口, Hook函数就必须写到Dll里面去这句有问题吧
hook=SetWindowsHookEx(WH_CBT,CBTproc,GetModuleHandle("STOPCREATE.dll"),0);
2010-4-22 22:22
0
雪    币: 21
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
hook=SetWindowsHookEx(WH_CBT,CBTproc,GetModuleHandle("STOPCREATE.dll"),0);
这句话应该没问题吧?我以前写其他类型的钩子都是这样写的,都没有其他问题的
2010-4-22 22:46
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
4
HHOOK SetWindowsHookEx(          int idHook,
    HOOKPROC lpfn,
    HINSTANCE hMod,
    DWORD dwThreadId
);
lpfn
[in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a DLL. Otherwise, lpfn can point to a hook procedure in the code associated with the current process.
2010-4-22 22:55
0
雪    币: 21
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
如果那句有问题 该如何修改呢?
2010-4-22 23:04
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
LRESULT CALLBACK CBTproc(int nCode,WPARAM wparam,LPARAM lparam)
{
if(nCode<0)
return CallNextHookEx(hook,nCode,wparam,lparam);
if(nCode==HCBT_CREATEWND)
{
HWND hwnd;
char _title[255];
hwnd=(HWND)wparam;
GetWindowText(hwnd,_title,sizeof(_title));
if(strcmp(title,_title)==0)
{
MessageBox(NULL,"不能打开该应用程序!","错误",0);
return 1;
}
return CallNextHookEx(hook,nCode,wparam,lparam);
}
return CallNextHookEx(hook,nCode,wparam,lparam);
}

把这个函数写到Dll里面去嘛,因为应用程序的地址空间是相互隔离的,如果要对别的应用程序进行操作,就要把代码加载到那个应用程序的地址空间里面去,所以就需要通过dll动态载入代码
2010-4-22 23:21
0
雪    币: 21
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我已经把这个函数写进DLL文件里了啦~~~,还是只是把CBTproc这个函数写进DLL,而其他的不写进?
2010-4-23 12:33
0
雪    币: 21
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢 古越魂 的热情回贴!我已基本知道问题的所在了,谢谢!
2010-4-23 19:40
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
9
你明白了呀?我今天调了一下,发现问题还是蛮多的,到现在还在调呢。。。首先在dll中不能用全局变量,因为这里涉及到一个重定位的问题,所以传递数据只能用内存映射文件,但是这里又涉及到了同步问题,希望楼主调出来后把源码发下,本人正在努力调试中
2010-4-23 21:19
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
hwnd=(HWND)wparam;你确定这个参数是 hwnd吗? 为什么用了这个参数什么数据也读不出来?
2010-4-23 21:22
0
雪    币: 21
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
是的,hwnd是句柄。我今天调试了下,主要是在传递数据时的问题

在DLL中使用了char title[255]这个全局变量

设置钩子的函数是sethook(char *s);

void sethook(char *s)
{
        if(strlen(s)==0)
                return;
        else
        {
                strcpy(title,s);
                Sleep(50);
                if(hook==NULL)
                        hook=SetWindowsHookEx(WH_CBT,CBTproc,hinstance,0);
        }
}

还有一个问题就是好像在窗口创建之前,是获取不了标题目的,是不?反正我今天试了好多次,用WH_CBT钩子试图在创建窗口时,获取标题,获取不了
2010-4-23 22:40
0
雪    币: 367
活跃值: (20)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
12
1.
#pragma data_seg(".shared")
把需要全局共享的变量放入此共享段.
#pragma comment(linker, "/SECTION:.shared,RWS")

2.
避免在钩子的回调中直接弹出messagebox这类新窗口.因为它也是窗口,一样会触发全局钩子回调.
2010-4-24 06:44
0
雪    币: 254
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
别的不说,你就那GetWindowText根本没必要调用。你看看MSDN中对HCBT_CREATEWND是怎么说的。
if(nCode == HCBT_CREATEWND )
{
    LPCBT_CREATEWND pCreated = (LPCBT_CREATEWND )lParam;
    if( lstrcmpi( pCreated->lpcs->lpszWindowName, title )== 0 )
    {
         //
    }
//....
}
另外,就楼上所说,你的Dll中应该定义一个具有共享属性的区段,这样你才能在自身进程中创建的HHOOK句柄,在其他进程中调用CallNextHookEx时,hook的值不会为NULL。
2010-4-24 17:00
0
雪    币: 173
活跃值: (132)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
14
调出来了
上传的附件:
2010-4-25 13:56
0
游客
登录 | 注册 方可回帖
返回
//