被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分,我在广州,如果解决人在广州,我可以请他吃饭。
呵呵。金钱诚可贵,知识价更高啊。
被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分,我在广州,如果解决人在广州,我可以请他吃饭。
呵呵。金钱诚可贵,知识价更高啊。
2
3 当然有影响,如果我说没有影响,你相信吗?具体有什么影响看MSDN中关于 hook 的说明。
4
对于4. WM_SETTEXT的东西传递主要是通过临时的内存映射文件来实现的。
2 可以设置标志量 初始化:i=0;在消息处理阶段: i++; if(i==1) {消息发送前;}
else { i=0;消息发送后;}
3 我想MFC消息传递归根结底并不是用了HOOK,而是用了子类化(个人观点,我记得《深入浅出MFC》好像也是这么说。但记得不清楚。)CWnd::SubclassWindow可以实现子类化。
4 我想是不会有任何影响的
希望你给分的承若要实现喔^-^
2,这个问题嘛,需要人为判断
3,会有影响,如果你在消息到达之前修改了消息,你想会怎样?
4,WM_SETTEXT消息的处理与其它消息处理是不同的?
有什么不同阿?接分哦:)
WM_SETTEXT消息的处理,至少有一点:他是使用临时的内存映射文件来实现数据传递的。呵呵。有机会看看我上面提到的那两本书。
3. 其实不是说mfc的消息传递最终是用hook, 而是说windows的消息传递最终也是用的hook.如果你处理不当确实会对系统造成影响, 钩子是后安装的钩子优先, 所以你自己的钩子要比你被钩的程序先得到消息, 如果在你的处理函数中不向下传递的话, 应用程序根本收不到消息了.
4.钩子本身肯不会有什么影响(因为spy已经证明了), 就看你自己怎么处理了.
HWND g_hWnd = 0; // control containing the password
HHOOK g_hHook = 0;
UINT WM_HOOKSPY = 0;
char ch[1024] = { '\0'};#pragma data_seg ()#pragma comment(linker,"/SECTION:.shared,RWS") //省略#define pCW ((CWPSTRUCT*)lParam)
LRESULT HookProc (
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
if( pCW->message == WM_SETTEXT ) {
if (pCW->hwnd == g_hWnd) {
::MessageBox(g_hWnd, ,(LPCSTR)pCW->lParam, NULL, MB_OK);
}
}
return ::CallNextHookEx(g_hHook, code, wParam, lParam);
}这是DLL中的关键部分
在WINDOWS2000下运行没有问题,但在WINDOWS Xp运行,总是报程序A(即被HOOK的程序)在0X000004处不能读取。所以我想可能是共享段出了问题。通过跟踪,问题可能出在g_hHook上。是不是XP和WIN2000在内存管理上有不同呢?
此外,我想把,(LPCSTR)pCW->lParam传回到自己的程序,对文本进行进一步处理,大家能给点思路吗?感谢楼上各位对我的问题的支持!
对一个窗口的子类化并不要原码,只要你有窗口的句柄,就可以子类化它
int idHook, // hook type
HOOKPROC lpfn, // hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // thread identifier
);
函数时最后一个参数是不是传入了0??
那样的话就勾住了所有GDI线程!!!!!
得到那个程序主线程的ID号,只勾住这一个线程。
SetWindowsHookEx(
int idHook, // hook type
HOOKPROC lpfn, // hook procedure
HINSTANCE hMod, // handle to application instance
DWORD dwThreadId // thread identifier
);
函数要的是这个控件所在程序的主线程ID号!!!!!!!
这样才能勾住这一个线程。
MessageBox()能显示出正确的文本,我现在需要解决的还是那几个老问题。
以及:在WINDOWS2000下运行没有问题,但在WINDOWS Xp运行,总是报程序A(即被HOOK的程序)在0X000004处不能读取。所以我想可能是共享段出了问题。通过跟踪,问题可能出在g_hHook上。是不是XP和WIN2000在内存管理上有不同呢?
此外,我想把,(LPCSTR)pCW->lParam传回到自己的程序,对文本进行进一步处理,大家能给点思路吗?
...............................
}
把(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 );
在WINDOWS2000下运行没有问题,但在WINDOWS Xp运行,总是报程序A(即被HOOK的程序)在0X000004处不能读取。
对于4.其实WM_COPYDATA和WM_SETTEXT等涉及部分消息都由系统自己,在底层使用临时内存映射文件进行处理,只要我们不干涉其运行,应该不会有太大的问题。