MFC DLL的问题

来源:百度知道 编辑:UC知道 时间:2024/06/21 01:08:12
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
//以便正确的读取对话框的资源
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//找到当前的有效激活窗口
CWnd *pCWnd = CWnd::GetForegroundWindow();
//生成CS3DHookDlg类的对象实例
//此处应该生成一个非模态对话框
pMainDlg = new CGameDllDlg();
pMainDlg->Create(IDD_DIALOG1, pCWnd);
pMainDlg->ShowWindow(SW_SHOW);
BOOL bKeyUp = lParam & (1 << 31);
if (bKeyUp && wParam == VK_F12 && nCode == HC_ACTION)
{
if (pMainDlg == NULL)
{
//更改当前有效模块状态到DLL中
//以便正确的读取对话框的资源
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//找到当前的有效激活窗口
CWnd *pCWnd = CWnd::GetForegroundWindow();
//生成CS3DHookDlg类的对象实例
//此处应该生成一个非模态对话框
pMainDlg = new CGameDllDlg();
pMainDlg->Create(IDD_DIALOG1, pCWnd);
pMainDlg->ShowWindow(SW_SHOW);
}
else
{
//根据窗口的状态来显示或隐藏 pMainDlg->ShowWindow(pMainDlg-&

键盘钩子?

要求:
1.不用全局钩子注入,比如 A.EXE(有一个以上的进程),当某一A.EXE前置时按F12呼出窗体
★如果采用全局钩子,就不需要特别的注入。因为全局钩子会自动加载钩子DLL。这也是为什么全局钩子必须写在DLL中原因。如果不采用全局钩子,因为你要HOOK远进程,所以你必须注入。但是注入之后,就不能直接操作DLL了,因为他和你不在一个进程。解决的方法是,使用DllMain函数。但是DllMain中,不能有引起线程阻塞的代码。变通的方法是,首先禁止线程通知消息,然后创建一个新的线程,在这个新的线程中创建一个窗口,并且,对创建窗口的线程下局部键盘挂钩,检测到F12就ShowWindow...这种方法,根本不需要特意去判断是不是最上面的窗口,因为只有处于焦点的窗口才会收到键盘消息,而你只是下了一个局部挂钩。只有你下了挂钩并且收到键盘消息的窗口,才会去调用你的挂钩。没有收到消息的窗口不会无缘无故出来的。

2.当关闭用来注入DLL的主程序时,还能完成1的功能.各进程间不共享HOOK句柄
★这个相当简单。一旦注入,就是等待LoadLibrary或者说DLLMAIN返回,用来注入的程序就可以返回了。没什么不可以。各进程间不共享HOOK句柄,晕。只要你不把他们放到共享段,那么他们本来就不会共享的。

相当关注