能力值:
( LV7,RANK:100 )
2 楼
如果要想打开其他应用程序的窗口, Hook函数就必须写到Dll里面去这句有问题吧
hook=SetWindowsHookEx(WH_CBT,CBTproc,GetModuleHandle("STOPCREATE.dll"),0);
能力值:
( LV2,RANK:10 )
3 楼
hook=SetWindowsHookEx(WH_CBT,CBTproc,GetModuleHandle("STOPCREATE.dll"),0);
这句话应该没问题吧?我以前写其他类型的钩子都是这样写的,都没有其他问题的
能力值:
( 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.
能力值:
( LV2,RANK:10 )
5 楼
如果那句有问题 该如何修改呢?
能力值:
( 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动态载入代码
能力值:
( LV2,RANK:10 )
7 楼
我已经把这个函数写进DLL文件里了啦~~~,还是只是把CBTproc这个函数写进DLL,而其他的不写进?
能力值:
( LV2,RANK:10 )
8 楼
感谢 古越魂 的热情回贴!我已基本知道问题的所在了,谢谢!
能力值:
( LV7,RANK:100 )
9 楼
你明白了呀?我今天调了一下,发现问题还是蛮多的,到现在还在调呢。。。首先在dll中不能用全局变量,因为这里涉及到一个重定位的问题,所以传递数据只能用内存映射文件,但是这里又涉及到了同步问题,希望楼主调出来后把源码发下,本人正在努力调试中
能力值:
( LV7,RANK:100 )
10 楼
hwnd=(HWND)wparam;你确定这个参数是 hwnd吗? 为什么用了这个参数什么数据也读不出来?
能力值:
( 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钩子试图在创建窗口时,获取标题,获取不了
能力值:
( LV5,RANK:70 )
12 楼
1.
#pragma data_seg(".shared")
把需要全局共享的变量放入此共享段.
#pragma comment(linker, "/SECTION:.shared,RWS")
2.
避免在钩子的回调中直接弹出messagebox这类新窗口.因为它也是窗口,一样会触发全局钩子回调.
能力值:
( 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。
能力值:
( LV7,RANK:100 )
14 楼
调出来了
上传的附件: