[高手请入]关于HOOK的问题!!

Oldyig 2003-10-17 11:17:46
被HOOK的程序:使用MFC4.2编写的windows程序A
被HOOK的对象:某一RichText控件
被HOOK的消息:WM_SETTEXT

问题:
1.利用了有关方法得到了控件的hwnd,并安装HOOK后,发现A程序中的所有WM_SETTEXT消息被HOOK了。并不能如同SPY++一样,只截获该控件的WM_SETTEXT。
2.每次均截获两个WM_SETTEXT消息,即处理之前与处理之后均发送该消息,如果才能做到只在处理之后(或后)截获该消息。
3.《深入浅出MFC》第二版曾提到:MFC的消息传递归根结底也是使用了HOOK,请问,如果我们再来HOOK其消息,会不会有何影响?
4.根据《WINDOWS核心编程》,WM_SETTEXT消息的处理与其它消息处理是不同的,试问,这会不会对我们的HOOK工作造成影响。

备注:
这个问题,我可以给1000分,我在广州,如果解决人在广州,我可以请他吃饭。
呵呵。金钱诚可贵,知识价更高啊。
...全文
83 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Oldyig 2003-10-26
  • 打赏
  • 举报
回复
来跟我联系:
QQ:22872957
Oldyig 2003-10-25
  • 打赏
  • 举报
回复
结帖了!!!考虑到没有广州的。。。请不请客了。
aachenG 2003-10-25
  • 打赏
  • 举报
回复
我广东的,每次回家都途经广州。。。
Oldyig 2003-10-24
  • 打赏
  • 举报
回复
呵呵,搞定了,主要是这一句程序的原因:主要是我的机器上我的朋友装了一个监控程序,想和我开玩笑,没想到被我发现了。但我也发现金山词霸等使用了相同技术的程序也会对ms.net2003造成影响了,我升级了SP2问题也是存在的。
对于4.其实WM_COPYDATA和WM_SETTEXT等涉及部分消息都由系统自己,在底层使用临时内存映射文件进行处理,只要我们不干涉其运行,应该不会有太大的问题。
flyccloud 2003-10-24
  • 打赏
  • 举报
回复
学习一下
DarkRiver 2003-10-24
  • 打赏
  • 举报
回复
你把你的程序在xp中重新编译一边试试,按道理讲不应该出现象你说的那种问题啊,我做的每一个钩子都可以运行在xp下面啊,它个2000的运行机制是一样的呀,另外你把这一句#pragma comment(linker,"/SECTION:.shared,RWS") 删掉,到def文件中用SECTIONS shared READ WRITE SHARED替换掉试一下
panzhaoping 2003-10-24
  • 打赏
  • 举报
回复
窗口是一个创建它的窗口线程或装了hook的线程所有的。
panzhaoping 2003-10-24
  • 打赏
  • 举报
回复
0X000004处不能读取
那你可以修改的阿,不要让编译器去从默认的地址去
Oldyig 2003-10-24
  • 打赏
  • 举报
回复
感谢楼上兄弟相处,现在还乘最后一个问题就是:


在WINDOWS2000下运行没有问题,但在WINDOWS Xp运行,总是报程序A(即被HOOK的程序)在0X000004处不能读取。
lzzqqq 2003-10-23
  • 打赏
  • 举报
回复
还有,你得到控件的hwnd有什么用呢??
SetWindowsHookEx(
int idHook, // hook type
HOOKPROC lpfn, // hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // thread identifier
);
函数要的是这个控件所在程序的主线程ID号!!!!!!!
这样才能勾住这一个线程。
lzzqqq 2003-10-23
  • 打赏
  • 举报
回复
你在调用HHOOK SetWindowsHookEx(
int idHook, // hook type
HOOKPROC lpfn, // hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // thread identifier
);
函数时最后一个参数是不是传入了0??
那样的话就勾住了所有GDI线程!!!!!
得到那个程序主线程的ID号,只勾住这一个线程。
Oldyig 2003-10-23
  • 打赏
  • 举报
回复
哦,我先学习一下.谢谢!
aachenG 2003-10-23
  • 打赏
  • 举报
回复
可以使用WM_COPYDATA
把(LPCSTR)pCW->lParam传回到自己的程序,对文本进行进一步处理

//發送:
#define MY_DATA MAKELONG( MAKEWORD('M', 'Y'), MAKEWORD('D', 'T') )
CWnd* pWnd = CWnd::FindWindow( NULL, "你窗口的標題" );
if (pWnd)
{
COPYDATASTRUCT cds;
cds.dwData = MY_DATA;
cds.lpData = pCW->lParam;
cds.cbData = nCount;

CWinApp* pApp = ::AfxGetApp();
HWND hWndSend;
if (pApp)
hWndSend = pApp->m_pMainWnd->GetSafeHwnd();

pTraceWin->SendMessage( WM_COPYDATA, (WPARAM) hWndSend, (LPARAM) &cds );
}

//接收:
afx_msg LRESULT OnCopyData( WPARAM wParam, LPARAM lParam );
Oldyig 2003-10-23
  • 打赏
  • 举报
回复
其中对于原题中的第1点和第2点,在我的程序中已经可以给出答案了:

if (pCW->hwnd == g_hWnd) {
...............................
}
Oldyig 2003-10-23
  • 打赏
  • 举报
回复
这个问题不用操心,我传入的是该控件的进程号。目前已经做到了
MessageBox()能显示出正确的文本,我现在需要解决的还是那几个老问题。
以及:

在WINDOWS2000下运行没有问题,但在WINDOWS Xp运行,总是报程序A(即被HOOK的程序)在0X000004处不能读取。

所以我想可能是共享段出了问题。通过跟踪,问题可能出在g_hHook上。是不是XP和WIN2000在内存管理上有不同呢?
此外,我想把,(LPCSTR)pCW->lParam传回到自己的程序,对文本进行进一步处理,大家能给点思路吗?
lyb12345 2003-10-22
  • 打赏
  • 举报
回复
to Oldyig(沒有花香):
对一个窗口的子类化并不要原码,只要你有窗口的句柄,就可以子类化它
sxxny 2003-10-21
  • 打赏
  • 举报
回复
我看你还是把具体的问题说一说, 容易解决一些
sxxny 2003-10-21
  • 打赏
  • 举报
回复
1,2. 你只有钩到消息以后自己再作判断!
3. 其实不是说mfc的消息传递最终是用hook, 而是说windows的消息传递最终也是用的hook.如果你处理不当确实会对系统造成影响, 钩子是后安装的钩子优先, 所以你自己的钩子要比你被钩的程序先得到消息, 如果在你的处理函数中不向下传递的话, 应用程序根本收不到消息了.
4.钩子本身肯不会有什么影响(因为spy已经证明了), 就看你自己怎么处理了.
Oldyig 2003-10-21
  • 打赏
  • 举报
回复
这两天,我把程序的雏形写出来了。但在XP下运行,如果没有HOOK就可以正常运行,如果加入HOOK,原程序A就会报错,就A内存违规访问。

楼上的,如果这个问题,真如你讲的这么简单的话,我想我也没会在这里说这个大话了。呵呵。
WM_SETTEXT消息的处理,至少有一点:他是使用临时的内存映射文件来实现数据传递的。呵呵。有机会看看我上面提到的那两本书。
scatzr 2003-10-21
  • 打赏
  • 举报
回复
1,需要判断richedit的句柄
2,这个问题嘛,需要人为判断
3,会有影响,如果你在消息到达之前修改了消息,你想会怎样?
4,WM_SETTEXT消息的处理与其它消息处理是不同的?
有什么不同阿?

接分哦:)
加载更多回复(6)

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧