关于HHook编程方面的收录

 
无悔今生
2010-04-22, 21:12:10
帮看看下边的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;
}
古越魂
2010-04-22, 22:22:11
如果要想打开其他应用程序的窗口, Hook函数就必须写到Dll里面去这句有问题吧
hook=SetWindowsHookEx(WH_CBT,CBTproc,GetModuleHandle("STOPCREATE.dll"),0);
无悔今生
2010-04-22, 22:46:36
如果要想打开其他应用程序的窗口, Hook函数就必须写到Dll里面去这句有问题吧
hook=SetWindowsHookEx(WH_CBT,CBTproc,GetModuleHandle("STOPCREATE.dll"),0);

hook=SetWindowsHookEx(WH_CBT,CBTproc,GetModuleHandle("STOPCREATE.dll"),0);
这句话应该没问题吧?我以前写其他类型的钩子都是这样写的,都没有其他问题的
古越魂
2010-04-22, 22:55:31
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-04-22, 23:04:59
如果那句有问题 该如何修改呢?
古越魂
2010-04-22, 23:21:26
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-04-23, 12:33:38
把这个函数写到Dll里面去嘛,因为应用程序的地址空间是相互隔离的,如果要对别的应用程序进行操作,就要把代码加载到那个应用程序的地址空间里面去,所以就需要通过dll动态载入代码

我已经把这个函数写进DLL文件里了啦~~~,还是只是把CBTproc这个函数写进DLL,而其他的不写进?
无悔今生
2010-04-23, 19:40:40
感谢 古越魂 的热情回贴!我已基本知道问题的所在了,谢谢!
古越魂
2010-04-23, 21:19:06
感谢 古越魂 的热情回贴!我已基本知道问题的所在了,谢谢!

你明白了呀?我今天调了一下,发现问题还是蛮多的,到现在还在调呢。。。首先在dll中不能用全局变量,因为这里涉及到一个重定位的问题,所以传递数据只能用内存映射文件,但是这里又涉及到了同步问题,希望楼主调出来后把源码发下,本人正在努力调试中
古越魂
2010-04-23, 21:22:48
hwnd=(HWND)wparam;你确定这个参数是 hwnd吗? 为什么用了这个参数什么数据也读不出来?
无悔今生
2010-04-23, 22:40:10
是的,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钩子试图在创建窗口时,获取标题,获取不了
morning
2010-04-24, 06:44:16
1.
#pragma data_seg(".shared")
把需要全局共享的变量放入此共享段.
#pragma comment(linker, "/SECTION:.shared,RWS")

2.
避免在钩子的回调中直接弹出messagebox这类新窗口.因为它也是窗口,一样会触发全局钩子回调.
margen
2010-04-24, 17:00:19
别的不说,你就那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-04-25, 13:56:08
调出来了;):

你可能感兴趣的:(编程,null,dll,callback,hook,2010)